我们可以使用OUTPUT子句来得到所插入的行。具体语句如下所示:
INSERT Product ([Name], ProductNumber, ListPrice)
OUTPUT inserted.ProductID,
inserted.[Name],
inserted.ProductNumber,
inserted.ListPrice
SELECT
[Name], ProductNumber, ListPrice
FROM
ProductsToInsert I
WHERE
NOT EXISTS (SELECT 1 FROM Product
WHERE ProductNumber = I.ProductNumber)
这差不多就是我们想要的了。我们得到了结果集的标识值,但我们没有利用这些数据,因为我们没法把它还原到原来的记录值。
我们还将需要增加两件事。首先,我们将需要储存此结果集保存到一个表值变量中。我会删除一些字段,使之更易于阅读;添加一个update语句以保存标识值。脚本如下所示:
DECLARE @InsertedRows TABLE (ProductID INT, ProductNumber NVARCHAR(25) )
INSERT Product ([Name], ProductNumber, ListPrice)
OUTPUT inserted.ProductID,
inserted.ProductNumber
INTO @InsertedRows
SELECT
[Name], ProductNumber, ListPrice
FROM
ProductsToInsert AS I
WHERE
NOT EXISTS (SELECT 1 FROM Product
WHERE ProductNumber = I.ProductNumber)
UPDATE ProductsToInsert
SET InsertedIdentityValue = T.ProductID
FROM ProductsToInsert I
JOIN @InsertedRows T ON T.ProductNumber = I.ProductNumber
SELECT RowID, ProductNumber, InsertedIdentityValue
FROM ProductsToInsert
WHERE InsertedIdentityValue IS NOT NULL
我们定义了一个表变量来存储OUTPUT子句的结果。我们使用OUTPUT into这个语法将结果存储到表变量中。
下一步我们使用表变量,根据插入的标识列更新源表。
最后,一个简单的SELECT语句返回新的数值,我们可以很容易地在其他语句中使用这些数值。
OUTPUT 子句对于在 INSERT操作之后检索标识列或计算列的值可能非常有用。另外OUTPUT子句也可以在UPDATE和DELETE语句中使用,从插入表或删除表中得到数值,并返回这些数值。青年人网站提示如果将参数或变量作为 UPDATE 语句的一部分进行了修改,则 OUTPUT 子句将始终返回语句执行之前的参数或变量的值而不是已修改的值。
以下语句中不支持 OUTPUT 子句:
l 引用本地分区视图、分布式分区视图或远程表的 DML 语句。
l 包含 EXECUTE 语句的 INSERT 语句。
l 不能将 OUTPUT INTO 子句插入视图或行集函数。
简洁的OUTPUT子句,使得向SQL Server导入数据的操作得到了极大的简化。
责任编辑:小草