T-SQL вставить и обновить внешний ключ без курсора
У меня есть две таблицы в MS SQL:
CREATE TABLE Table1 (ID INT IDENTITY(1,1) NOT NULL, TEXTVal VARCHAR(100), Table2Id int)
insert into Table1 (TEXTVal) values('aaa');
insert into Table1 (TEXTVal) values('bbb'); insert into Table1 (TEXTVal) values('ccc');
CREATE TABLE Table2 (ID INT IDENTITY(1,1) NOT NULL, TEXTVal VARCHAR(100), Table2Id int)
Идентификаторы - столбцы идентификаторов. Я хочу скопировать значения TEXTVal из Таблицы1 в Таблицу2:
INSERT INTO Table2 (TEXTVal)
SELECT TEXTVal FROM Table1
where TEXTVal <> 'ccc'
и после этого обновите столбец Table2Id в Table1 с соответствующими значениями Id из Table2. Я могу сделать это с помощью курсора и SCOPE_IDENTITY().
Мне просто интересно, есть ли способ сделать это без курсора в T-SQL?
1 ответ
Как сказал Jeroen в комментариях, вы захотите использовать OUTPUT
, В следующем примере, если у вас нет базы данных AdventureWorks, просто используйте тестовую базу данных. Вы должны быть в состоянии скопировать / вставить это и просто запустить его, чтобы увидеть это в действии!
USE AdventureWorks;
GO
----Creating the table which will store permanent table
CREATE TABLE TestTable (ID INT, TEXTVal VARCHAR(100))
----Creating temp table to store ovalues of OUTPUT clause
DECLARE @TmpTable TABLE (ID_New INT, TEXTVal_New VARCHAR(100),ID_Old INT, TEXTVal_Old VARCHAR(100))
----Insert values in real table
INSERT TestTable (ID, TEXTVal)
VALUES (1,'FirstVal')
INSERT TestTable (ID, TEXTVal)
VALUES (2,'SecondVal')
----Update the table and insert values in temp table using Output clause
UPDATE TestTable
SET TEXTVal = 'NewValue'
OUTPUT Inserted.ID, Inserted.TEXTVal, Deleted.ID, Deleted.TEXTVal INTO @TmpTable
WHERE ID IN (1,2)
----Check the values in the temp table and real table
----The values in both the tables will be same
SELECT * FROM @TmpTable
SELECT * FROM TestTable
----Clean up time
DROP TABLE TestTable
GO
ResultSet:
TmpTable:
ID_New TextVal_New ID_Old TextVal_Old
——————— ——————— ——————— ———————
1 NewValue 1 FirstVal
2 NewValue 2 SecondVal
Original Table:
ID TextVal
——————— ———————
1 NewValue
2 NewValue
Как видите, можно фиксировать новые значения и значения, которые вы обновляете. В этом примере я просто вставляю их в переменную таблицы, но вы можете делать с ними все, что захотите.:)