Wor*_*gon 33 sql t-sql temp-tables sql-server-2008 sp-executesql
试图在sp_Executedsql中选择...到临时表#TempTable.不是它成功插入或没有,但有消息写入(359行受影响)意味着成功插入?下面的脚本
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = 'select distinct Coloum1,Coloum2 into #TempTable
from SPCTable with(nolock)
where Convert(varchar(10), Date_Tm, 120) Between @Date_From And @Date_To';
SET @Sql = 'DECLARE @Date_From VARCHAR(10);
DECLARE @Date_To VARCHAR(10);
SET @Date_From = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+''';
SET @Date_To = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+''';
'+ @Sql;
EXECUTE sp_executesql @Sql;
Run Code Online (Sandbox Code Playgroud)
执行后,它返回我的消息(359行受影响).接下来尝试从#TempTable中选择数据时.
Select * From #TempTable;
Run Code Online (Sandbox Code Playgroud)
它回报我:
Msg 208, Level 16, State 0, Line 2
Invalid object name '#TempTable'.
Run Code Online (Sandbox Code Playgroud)
怀疑它只在'选择'部分工作.插入不起作用.如何解决?
Rob*_*lis 38
在此方案中使用全局临时表可能会导致问题,因为会话之间存在表,并且可能会导致使用调用代码异步的某些问题.
如果在调用sp_executesql之前定义了本地临时表,则可以使用本地临时表
CREATE TABLE #tempTable(id int);
sp_executesql 'INSERT INTO #tempTable SELECT myId FROM myTable';
SELECT * FROM #tempTable;
Run Code Online (Sandbox Code Playgroud)
Mic*_*aga 28
本地临时表#table_name仅在当前会话##table_name中可见,全局临时表在所有会话中都可见.两人的生命直到会议结束.
sp_executesql - 创建自己的会话(也许单词"范围"会更好),这就是它发生的原因.
Mar*_*ngh 11
在您的@sql字符串中,请勿插入into #TempTable.相反,在SELECT没有声明的情况下调用您的INSERT声明
最后,将结果插入临时表中,如下所示:
INSERT INTO @tmpTbl EXEC sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)
此外,如果使用此方法,则需要声明临时表
DECLARE @tmpTbl TABLE (
//define columns here...
)
Run Code Online (Sandbox Code Playgroud)