如何从另一个表更新临时表

3

我有一个包含DetailID、PackageID、TemplateID和DocumentID列的[DETAIL]表。其中,DetailID列是主键。

然后,在存储过程中,我使用了一个临时表。

DECLARE @temp TABLE
(
    DetailID INT NULL,
    PackageID INT,
    TemplateID INT NULL,
    DocumentID INT NULL,        
)

该临时表已经填充了PackageID、TemplateID和DocumentID。

我正在尝试使用匹配的行更新临时表中的DetailID。对于不匹配的行,在临时表中DetailID将为null。

UPDATE @temp 
SET DetailID = D.DetailID
FROM Details D
WHERE D.PackageID = @temp.PackageID AND 
                  ((D.TemplateID IS NOT NULL AND D.TemplateID = @temp.TemplateID) OR
                  (D.DocumentID IS NOT NULL AND D.DocumentID = @temp.DocumentID))

我遇到了一个错误

必须声明标量变量 "@temp"


1
顺便提一下,空值检查是多余的。空值永远不会等于空值,因此检查 templateid 不为空 然后再进行相等性检查是不必要的。SQL 可能会对它们进行优化,但也可能不会。只是想提一下。 - Xedni
如果模板ID和文件ID均为空,则不想选择行。 - LP13
没错,文档 ID 也是一样的。 - Xedni
2个回答

8
这里有一个解决问题的方案(演示)。
或者你可以使用“UPDATE ... FROM .... JOIN”语法,并给它一个别名。
UPDATE @temp
SET DetailID = D.DetailID
FROM Details D
WHERE D.PackageID = [@temp].PackageID AND 
                  ((D.TemplateID IS NOT NULL AND D.TemplateID = [@temp].TemplateID) OR
                  (D.DocumentID IS NOT NULL AND D.DocumentID = [@temp].DocumentID))

1
啊..原来我漏掉了[...] - LP13
@LP13 是的,但第一个实例不需要那些,那时我犯了错误然后进行了编辑。 - Martin Smith

3

尝试更改为以下内容:

UPDATE t 
SET DetailID = D.DetailID
FROM Details D
JOIN @temp t
    ON t.PackageID = d.PackageID
    AND (
        (D.TemplateID IS NOT NULL AND D.TamplateID = t.TemplateID) 
        OR (D.DocumentID IS NOT NULL AND D.DocumentID = t.DocumentID)
    )

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