44

试图选择...进入 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;

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

Select * From #TempTable;

它还给我:

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

怀疑它仅在“选择”部分工作。插入不工作。如何修复它?

4

9 回答 9

45

在这种情况下使用全局临时表可能会导致问题,因为该表将存在于会话之间,并且可能会导致异步使用调用代码时出现一些问题。

如果在调用 sp_executesql 之前定义了本地临时表,则可以使用它,例如

CREATE TABLE #tempTable(id int);

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

SELECT * FROM #tempTable;
于 2012-08-10T10:12:10.773 回答
37

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

于 2011-11-07T17:28:28.277 回答
14

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

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

INSERT INTO @tmpTbl EXEC sp_executesql @sql

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

DECLARE @tmpTbl TABLE (
    //define columns here...
)
于 2017-05-02T17:51:32.950 回答
7

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

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

于 2011-11-07T17:28:03.997 回答
3

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

于 2011-11-07T17:29:02.900 回答
2
declare @sql varchar(1000)
set @sql="select * into #t from table;"
set @sql =@sql + "select * from #t;"

 execute  SP_EXECUTESQL  @sql
于 2016-05-31T12:00:59.147 回答
2

这对我有用

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
于 2018-08-21T19:31:53.330 回答
1

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

于 2016-03-22T10:18:22.190 回答
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;
于 2021-02-28T10:33:00.740 回答