【问题标题】:Using OUTPUT INTO with from_table_name in an INSERT statement [duplicate]在 INSERT 语句中使用带有 from_table_name 的 OUTPUT INTO [重复]
【发布时间】:2020-03-25 12:26:15
【问题描述】:

Microsoft's OUTPUT Clause documentation 表示您可以在 OUTPUT 子句的列名中使用 from_table_name

有两个例子:

是否也可以在 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;

【问题讨论】:

标签: sql sql-server tsql output-clause


【解决方案1】:

不,因为 INSERT 没有 FROM;它有一组由 VALUES 关键字或查询准备的值(即使该查询有一个 FROM,您应该认为它已经运行并在插入时变成了一个值块完成;不再有s.code

如果您想从驱动插入的表中输出某些内容,则需要使用从不匹配任何记录的合并语句(因此它只是插入),或者可能将所有数据插入 @tmp 然后插入从@tmp 到真实表 - 因此@tmp 仍将是插入行的记录,只是创建它是为了驱动插入而不是它的结果(注意它不包含计算列)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多