【问题标题】:How to update temp table from another table如何从另一个表更新临时表
【发布时间】:2017-09-19 03:45:48
【问题描述】:

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

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

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

临时表已经填充了 PackageID、TemplateID 和 DocumentID。 我正在尝试使用匹配的行更新 Temp 表的 DetailID。对于不匹配的行,DetailID 在临时表中将为空

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”

【问题讨论】:

  • FWIW,空检查是多余的。 null 永远不会等于 null,因此检查 templateid is not null 并检查其相等性会进行不必要的检查。 SQL 可能会优化它们,但可能不会。只是想我会提到它。
  • 如果 templateid 和 documentid 都为空,我不想选择行
  • 对。同样适用于文档 ID。

标签: sql-server tsql


【解决方案1】:

这是解决问题的一种方法 (demo)

您也可以使用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))

【讨论】:

  • 啊.. 所以我错过了 [...]
  • @LP13 是的,但是第一个实例需要这些,我犯了那个错误然后编辑了它。
【解决方案2】:

尝试改成这样:

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)
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多