【发布时间】: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