在一个INSERT语句中,使用from_table_name的OUTPUT INTO。

7
根据Microsoft的OUTPUT Clause文档,你可以在OUTPUT子句的列名中使用from_table_name。有两个示例可以参考:在UPDATE语句中使用带有from_table_name的OUTPUT INTO在DELETE语句中使用带有from_table_name的OUTPUT INTO
那么,在INSERT语句中是否也可以使用呢?
INSERT INTO T ( [Name] )
OUTPUT S.Code, inserted.Id INTO @TMP -- The multi-part identifier "S.Code" could not be bound.
SELECT [Name] FROM S;

使用表变量导致失败的示例

-- A table to insert into.
DECLARE @Item TABLE (
    [Id] [int] IDENTITY(1,1),
    [Name] varchar(100)
);
-- A table variable to store inserted Ids and related Codes
DECLARE @T TABLE (
    Code varchar(10),
    ItemId  int
);
-- Insert some new items
WITH S ([Name], Code) AS (
    SELECT 'First', 'foo'
    UNION ALL SELECT 'Second', 'bar'
    -- Etc.
)
INSERT INTO @Item ( [Name] )
OUTPUT S.Code, inserted.Id INTO @T -- The multi-part identifier "S.Code" could not be bound.
SELECT [Name] FROM S;

1
未插入的源列只能在MERGE中被引用/输出。 - lptr
这个回答解决了你的问题吗?SQL Output子句是否可以返回未插入的列? - SMor
@SMor 是的,它做到了!那是一个我没有找到的重复答案。 - ANisus
1个回答

5
不行,因为INSERT没有FROM;它有一组值,这些值是通过VALUES关键字准备的,或者来自查询(即使该查询有FROM,你也应该认为它已经运行并在插入完成时转换为值块;没有s.code了)。如果您想从驱动插入的表中输出某些内容,则需要使用永远不匹配任何记录的合并语句(因此仅插入),或者将所有数据插入到@tmp中,然后从@tmp插入到实际表中-@tmp仍然是插入的行的记录,只是它是为了驱动插入而创建的,而不是作为其结果(注意,它不包含计算列)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接