sql-server - 使用临时表比较 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”。
解决方案
由于临时表的范围有限,请尝试在一次执行中执行所有语句:
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
) 表。
推荐阅读
- python - 可以将两个逻辑表达式合二为一
- reactjs - Netlify / Gatsby / React - 我需要以“?&”开头的页面
- rxjs - 无法在 playcode 代码沙箱中使用 rxjs
- dictionary - 如何从字典中获取无效的 Tcl 值并针对整数进行测试?
- spring-boot - 无法让此控制器返回具有正确 mime 类型的文件
- reactjs - 将异步函数放入 useEffect 后出现错误
- javascript - 通过来自 woocommerce HTML 变体的数据集生成 JS 变量数组
- c# - Windows SC.exe如何查询服务的控制码
- visual-studio-code - indentationRule 在 vscode language-configuration.json 中不起作用
- c# - aws cdk 应用程序负载均衡器无法创建错误,缺少默认操作所需的参数