【问题标题】:TSQL The multi-part identifier "b.ID" could not be bound. using INSERT OUTPUT SELECTTSQL 无法绑定多部分标识符“b.ID”。使用插入输出选择
【发布时间】:2016-06-08 03:25:12
【问题描述】:

我不确定为什么这不起作用,语法看起来不错,但我不确定,我以前从未使用过此语句,所以我可能做错了什么。

IF @PreCheckPassed = 1 
    --First recreate the lots that where deleted and store the new ID's
    INSERT INTO [tblContainers] ([Name], [FeedLotID])
        OUTPUT INSERTED.[ID], [b].[ID], INSERTED.[Name] INTO @CreatedLots
        SELECT 
            [b].[Name], [b].[FYID] 
        FROM 
            @MergedLots AS [b]

SELECT * FROM @CreatedLots

错误发生在 [b].[ID] 的 OUTPUT

无法绑定多部分标识符“b.ID”。

我正在做的只是根据@MergedLots 表中的列表创建一些新记录,并且我正在尝试使用@MergedLots ID 输出新 ID,以便稍后链接其他数据。

有什么想法吗?

【问题讨论】:

  • 它的写法意味着@CreatedLots 有两个Id 列。您能否给出@CreatedLots@MergedLotstblContainers 中的列并指出其中哪些具有标识列?
  • 它们都有 ID 列,@createdLots 有 1 个主键列,还有 2 个用于数据的其他列,一个 INT 和一个 VARCHAR,
  • INSERT 语句的OUTPUT 子句只能有inserted.column(目标表中的列)。它不能包含源表中的列。在您的示例中,[b].[ID] 是源表中的一列。 MERGE 语句的 OUTPUT 子句可以包含来自源表和目标表的列。

标签: sql-server tsql


【解决方案1】:

看看这个。它使用 MergeInsert

Using OUTPUT clause to insert value not in INSERTED

merge into [tblContainers] A
USING @MergedLots AS [b]
on 1=0
WHEN NOT MATCHED THEN
 Insert ([Name], [FeedLotID])
 Values ([b].[Name], [b].[FYID])
OUTPUT 
 INSERTED.[ID], b.Id, INSERTED.[Name] INTO @CreatedLots;

此查询不会对性能友好。或者,您可以有两个查询,第一个不考虑b.Id

INSERT INTO [tblContainers] ([Name], [FeedLotID])
    OUTPUT INSERTED.[ID], INSERTED.[Name] INTO @CreatedLots
    SELECT [b].[Name], [b].[FYID] 
    FROM @MergedLots AS [b]

以及一个单独的 Update 查询来更新 id

【讨论】:

  • 我在考虑第二种方法,但我认为它太危险了,即使这个表中的名称“不应该”有重复我不想引起问题:)。但我确实使用了其他方法。
  • 好吧,如果你不能保证唯一性,你将不得不使用 Merge 选项虽然,如果你需要考虑这样的解决方法,你可能需要重做您的存储过程和临时表的使用。
  • 我正在使用它来恢复已删除的记录,我拥有的原始 IDS 但显然它们不再在数据库中,当我撤消删除时我需要重新链接它们。这只是整个 SP 的一小部分,所以我只是重用了一些我已经拥有的临时表.....它是一次性操作,所以性能现在不是问题:)
【解决方案2】:

查看https://msdn.microsoft.com/en-us/library/ms177564.aspx 的文档,特别是“from_table_name”的描述。我担心你不走运;如果我没看错的话,它说它只适用于除 INSERT 之外的每个更新语句。

【讨论】:

  • ::= { 已删除 |插入 | from_table_name } 。 { * |列名} | $action 暗示我可以使用以下任何一种语法(DELETED.ID | INSERTED.ID | MyTable.ID)所以我的语法应该没问题,也允许使用别名......我只是在徘徊我是否需要更改输出选择或其他东西的顺序
猜你喜欢
  • 2013-08-17
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
相关资源
最近更新 更多