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

时间:2011-11-07 17:22:57

标签: sql sql-server-2008 tsql sp-executesql temp-tables

尝试在sp_Executedsql中选择...到临时表#TempTable。 不是它成功插入或没有但有消息那里写 (359行(s)受影响)意味着成功插入? 下面的脚本

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;

执行后,它会返回消息(359行受影响)。 接下来尝试从#TempTable中选择数据时。

Select * From #TempTable;

它回报我:

Msg 208, Level 16, State 0, Line 2
Invalid object name '#TempTable'.

怀疑它只在'选择'部分工作。插入不起作用。 如何解决?

9 个答案:

答案 0 :(得分:38)

在此方案中使用全局临时表可能会导致问题,因为会话之间存在表,并且可能会导致使用调用代码异步的某些问题。

如果在调用sp_executesql之前定义了本地临时表,例如

,则可以使用本地临时表
CREATE TABLE #tempTable(id int);

sp_executesql 'INSERT INTO #tempTable SELECT myId FROM myTable';

SELECT * FROM #tempTable;

答案 1 :(得分:28)

本地临时表#table_name仅在当前会话中可见,全局临时##table_name表在所有会话中都可见。两人的生命直到会议结束。 sp_executesql - 创建自己的会话(也许是“范围”更好),这就是它发生的原因。

答案 2 :(得分:11)

@sql字符串中,请勿插入into #TempTable。相反,请在没有SELECT声明的情况下调用INSERT语句。

最后,将结果插入临时表中,如下所示:

INSERT INTO @tmpTbl EXEC sp_executesql @sql

此外,如果您使用此方法,则需要声明临时表

DECLARE @tmpTbl TABLE (
    //define columns here...
)

答案 3 :(得分:7)

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

请看这里如何处理:A bit about sql server's local temp tables

答案 4 :(得分:3)

临时表仅在创建它们的连接中存在。我希望您无意中在单独的连接上发出选择。您可以通过暂时将插入到非临时表中并查看数据是否存在来对此进行测试。如果是这种情况,您可以返回原始解决方案,并确保将连接对象传递给您的选择。

答案 5 :(得分:1)

要解决此问题,请首先使用CREATE TABLE #TEMPTABLE命令在运行sp_executesql之前生成空临时表。然后使用sp_executesql运行INSERT INTO #TEMPTABLE。这会奏效。这就是我克服这个问题的方法,因为我有一个设置,其中所有查询通常都是通过sp_executesql运行的。

答案 6 :(得分:1)

declare @sql varchar(1000)
set @sql="select * into #t from table;"
set @sql =@sql + "select * from #t;"

 execute  SP_EXECUTESQL  @sql

答案 7 :(得分:1)

这对我有用

declare @sql nvarchar(max)     
create table #temp ( listId int, Name nvarchar(200))     
set @sql = 'SELECT top 10 ListId, Name FROM [V12-ListSelector].[dbo].[List]'    
insert into #temp
exec sp_executesql  @sql    
select * from #temp    
drop table #temp

答案 8 :(得分:0)

这个对我有用:

DECLARE @Query as NVARCHAR(MAX);
SET @Query=(SELECT * FROM MyTable) ;
SET @Query=(SELECT 'SELECT * INTO dbo.TempTable FROM ('+@Query +') MAIN;');
EXEC sp_executesql @Query;

SELECT * INTO #TempTable FROM dbo.TempTable;
DROP TABLE dbo.TempTable;
SELECT * FROM #TempTable;