【问题标题】:How to UPDATE #temptable如何更新#temptable
【发布时间】:2013-04-08 07:10:12
【问题描述】:
CREATE TABLE #TempProducts (
    Id uniqueidentifier,
    ManufacturerId uniqueidentifier,
    Number varchar(50),
    PresentId uniqueidentifier null)

如何更新 PresentId 字段?我对此有不同的错误:

1) 数据库中已有一个名为“#TempProducts”的对象。

UPDATE #TempProducts
SET #TempProducts.PresentId = p.Id
FROM #TempProducts JOIN Products p ON (#TempProducts.ManufacturerId = p.ManufacturerId AND #TempProducts.Number = p.Number)
WHERE #TempProducts.Id <> p.Id

2) 多部分标识符“t.PresentId”无法绑定。

UPDATE #TempProducts
SET t.PresentId = p.Id
FROM #TempProducts t JOIN Products p ON (t.ManufacturerId = p.ManufacturerId AND t.Number = p.Number)
WHERE t.Id <> p.Id

【问题讨论】:

    标签: sql tsql temp-tables


    【解决方案1】:

    对于第二个错误,请尝试:

    UPDATE t
    SET t.PresentId = p.Id
    FROM #TempProducts t JOIN Products p ON (t.ManufacturerId = p.ManufacturerId AND t.Number = p.Number)
    WHERE t.Id <> p.Id
    

    【讨论】:

    • 不是我的反对意见,但这与示例 1 有何不同?使用表名而不是别名很好。
    • @JW :) 没关系。第二个查询得到The multi-part identifier "t.PresentId" could not be bound.。当我尝试使用 elias t 时,它起作用了(至少错误消失了)。
    【解决方案2】:
    UPDATE t
    SET t.PresentId = p.Id
    FROM #TempProducts t JOIN Products p ON (t.ManufacturerId = p.ManufacturerId AND t.Number = p.Number)
    WHERE t.Id <> p.Id
    

    这将修复第二个错误(UPDATE t 而不是 UPDATE #TempProducts)。但是,第一个查询不可能产生上述错误。

    我猜你正在再次执行 CREATE TABLE 查询,这会产生错误,因为临时表已经存在。

    您应该在创建临时表时使用这样的检查:

    IF (OBJECT_ID('tempdb..#TempProducts') IS NOT NULL) DROP TABLE #TempProducts
    CREATE TABLE #TempProducts (
        Id uniqueidentifier,
        ManufacturerId uniqueidentifier,
        Number varchar(50),
        PresentId uniqueidentifier null)
    

    【讨论】:

      【解决方案3】:

      由于代表限制无法发表评论,但 SQL Server 2012 或更高版本不再需要IF (OBJECT_ID('tempdb..#TempProducts') IS NOT NULL) DROP TABLE #TempProducts"。您现在可以使用更简单的 DROP TABLE IF EXISTS #TempProducts 语法。

      【讨论】:

        【解决方案4】:

        对于问题1:(在CREATE TABLE语法之前)

        if object_id(tempdb..#TempProducts) is not null
        begin
            drop table #TempProducts 
        end
        

        对于问题 2,我认为 @techdo 是正确的。

        UPDATE t
        SET t.PresentId = p.Id
        FROM #TempProducts t JOIN Products p 
        ON (t.ManufacturerId = p.ManufacturerId AND t.Number = p.Number)
        WHERE t.Id <> p.Id
        

        【讨论】:

          猜你喜欢
          • 2019-07-06
          • 1970-01-01
          • 1970-01-01
          • 2019-11-30
          • 2020-09-16
          • 2023-03-23
          • 2014-10-04
          • 2019-11-08
          • 2011-02-16
          相关资源
          最近更新 更多