我将查询的中间结果导入临时表以供进一步使用,因此我使用#temp表来维护与
相同的模式select * into # temp from schema.tableName where 1<>1;
insert into # temp from exec(table)
虽然我将此语句作为变量来传递不同的tableName但它不起作用
SET @TEMPSCHEMA = 'SELECT * INTO #temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1;'
exec(@TEMPSCHEMA)
INSERT INTO #temp
EXEC ( @SELECTSTATEMENT
)
但是在exec语句之后它没有将值带到临时表。
显示无效的对象ID #temp
答案 0 :(得分:3)
这是因为EXEC
语句的范围与包含的sproc的范围不同。也就是说,您对EXEC
的调用正在创建临时表,然后它将自动删除,因为EXEC
的范围仍然存在。你基本上必须在一个 EXEC
语句中完成所有操作:
DECLARE @sql VARCHAR(MAX)
SET @sql = 'SELECT * INTO #temp
FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1
INSERT INTO #temp ...'
EXEC(@sql)
答案 1 :(得分:1)
动态SQL完成执行后,本地临时表超出范围。
你必须做这样的事情:
-- everything w/ dynamic sql
SET @TEMPSCHEMA = '
SELECT * INTO #temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1;
INSERT INTO #temp EXEC (@SELECTSTATEMENT)
SELECT .... -- whatever else you need to do
'
exec sp_executesql @TEMPSCHEMA, N'@SELECTSTATEMENT NVARCHAR(MAX)', @SELECTSTATEMENT
或
-- global temp table rather than local
SET @TEMPSCHEMA = 'SELECT * INTO ##temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1;'
exec(@TEMPSCHEMA)
INSERT INTO ##temp EXEC (@SELECTSTATEMENT)
答案 2 :(得分:1)
我将查询的中间结果导入临时表以供进一步使用
这部分几乎总是一个错误。你可以分享下一步或下两步你打算做什么吗?可能性很大,我们可以在同一个声明中重写这一切。
答案 3 :(得分:1)
不支持运行必须使用into语句将数据插入临时表的动态语句。先创建临时表,然后使用动态查询插入临时表将正常工作。原因是当使用exec()语句在子上下文中运行时,一旦上下文关闭,动态临时表也会丢失。
答案 4 :(得分:0)
exec(@TEMPSCHEMA)会在你的程序的不同上下文中运行,因此一旦exec完成,#temp就不再存在了吗?
啊,是的,here it is