【问题标题】:Stored procedure "forgetting" field between update and insert statement更新和插入语句之间的存储过程“忘记”字段
【发布时间】:2020-01-13 17:39:44
【问题描述】:

我们有一个存储过程,用于UPDATE 一个表,其值是从现有列中计算出来的。

我正在尝试将存储过程修改为将INSERT 的一行也放入另一个表中,使用同一列的值,但该列被解析器作为无效的列名拒绝。

这是代码的精简版本。正如最初提供的那样,sequence_no 是存储过程已知的,并以reference_no 结束。即UPDATE 有效,但INSERT 失败。

ALTER PROCEDURE [dbo].[update_references]
AS
    -- Original contents:
    UPDATE table1
    SET reference_no = sequence_no
    FROM table1 t1 WITH (NOLOCK)
    LEFT OUTER JOIN proptable p1 WITH (NOLOCK) ON t1.checkval = p1.checkval
    WHERE p1.fruit = 'apple'

    -- I have added the INSERT 
    INSERT INTO table2 (next_seq_no)
    VALUES (sequence_no)    

sequence_no 在 SSMS 中带有红色下划线。

【问题讨论】:

  • 加下划线是因为 sequence_no 不是列名。我假设它是一个变量,因为你说它是传入的。所以它应该是@sequence_no。
  • 与问题无关,但您是否有充分的理由使用NOLOCK?它可能(并且将会)导致您的查询提供错误的结果。
  • 您绝对不应该在 UPDATE 目标上使用 NOLOCK。它已被弃用,已导致损坏,并且 SQL Server 仍然会锁定 mssqltips.com/sqlservertip/3172/…
  • @JMabee 看起来 sequence_no 属于我的 proptable
  • @MartinSmith 我同意 - sequence_no 很可能是 proptable 中的列名。由于它是列而不是值,因此该值不会“在内存中”,并且无法在第二次插入中引用。

标签: sql-server stored-procedures


【解决方案1】:

代码中的插入语句对先前的更新一无所知,因此您不能从中引用随机列并期望它们仍在范围内。最简单的方法是使用OUTPUT 子句。

UPDATE table1
SET reference_no = sequence_no
OUTPUT INSERTED.reference_no INTO table2 (next_seq_no)
FROM table1 t1
LEFT OUTER JOIN proptable p1 ON t1.checkval = p1.checkval
WHERE p1.fruit = 'apple'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多