执行sp_executeSql以选择...到#table但不能选择临时表数据

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 - 创建自己的会话(也许单词"范围"会更好),这就是它发生的原因.

  • 注意:`sp_executesql` 不*不*创建自己的会话。相反,它创建自己的 *batch*(或执行上下文)。临时表*可以*被同一会话中的其他批次看到。但是,因为它们在创建它们的批处理退出时被删除,实际上,它们只能被下级批处理看到(即由创建临时表的同一上下文创建的执行上下文)。 (4认同)
  • 我认为"范围"这个词会更好.`DECLARE @sql NVARCHAR(MAX); SET @sql ='SELECT @@ SPID'; 执行sp_executesql @sql; SELECT @@ SPID` (2认同)

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)


Mla*_*dic 7

动态SQL中的临时表超出了非动态SQL部分的范围.

看看这里如何处理这个:关于sql server的本地临时表