首页 > 解决方案 > 使用临时表比较 SQL Server 存储过程中的 2 个表

问题描述

我正在尝试创建一个存储过程来比较 2 个表并使它们相同。我试过这段代码:

CREATE PROCEDURE SESUS.Compare2Tables
      (@Table1 AS NVARCHAR(255),
       @Table2 AS NVARCHAR(255),
       @key AS NVARCHAR(MAX))
AS
BEGIN
    IF OBJECT_ID ('tempdb..#tmp') IS NOT NULL
        DROP TABLE #tmp

    --print 'SELECT * INTO #tmp FROM ' + @Table2  + ' except select * from ' + @Table1 + ';'
    --print 'delete from ' + @table1 + ' where ' + @key + ' in (select ' + @key + ' from #tmp);'  
    --print 'insert into ' +@table1 + ' select * from ' +@table2 + ' where ' +@key + ' in (select ' +@key + ' from #tmp);'

    exec ('SELECT * INTO #tmp FROM ' + @Table2  + ' except select * from ' + @Table1 + ';')
    exec ('delete from ' + @table1 + ' where ' + @key + ' in (select ' + @key + ' from #tmp)')
    exec ('insert into ' +@table1 + ' select * from ' +@table2 + ' where ' +@key + ' in (select ' +@key + ' from #tmp)')
END

但它返回以下错误,知道为什么它可以插入到这个临时表中,但不能选择它吗?

无效的对象名称“#tmp”。

标签: sql-server

解决方案


由于临时表的范围有限,请尝试在一次执行中执行所有语句:

exec ('SELECT * INTO #tmp FROM ' + @Table2  + ' except select * from ' + @Table1 + ';
        delete from ' + @table1 + ' where ' + @key + ' in (select ' + @key + ' from #tmp)
        insert into ' +@table1 + ' select * from ' +@table2 + ' where ' +@key + ' in (select ' +@key + ' from #tmp)')

您还可以使用全局 temp ( ##tmp) 表。


推荐阅读