Exécuter sp executeSql pour select...dans la table #mais ne peut pas sélectionner les données de la table Temp

essayait de sélectionner...dans une Table temporaire #TempTable dans sp_Executedsql. Pas son inséré avec succès ou pas, mais là des Messages écrits (359 ligne(s) affectée) qui signifie succès inséré? Le Script ci-dessous

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;

après l'exécution, son retour sur les messages(359 ligne (s) affectée (s)). Suivant en essayant de sélectionner les données à partir de #TempTable.

Select * From #TempTable;

retour-moi:

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

a suspecté son fonctionnement seulement la section 'select' seulement. Le l'insert n'est pas de travail. comment résoudre ce problème?

28
demandé sur Cœur 2011-11-07 21:22:56

8 réponses

table temporaire Locale #table_name est visible dans la session en cours seulement, global temporaire ##table_name tableaux sont visibles dans toutes les sessions. Les deux vivent jusqu'à la fin de leur session. sp_executesql - crée sa propre session (peut-être que le mot "scope" serait mieux) donc c'est la raison pour laquelle cela se produit.

26
répondu Michał Powaga 2013-08-12 05:12:36

L'utilisation d'une table temporaire globale dans ce scénario pourrait causer des problèmes car la table existerait entre les sessions et pourrait entraîner des problèmes en utilisant le code d'appel de façon asynchrone.

une table temporaire locale peut être utilisée si elle est définie avant d'appeler sp_executesql par exemple

CREATE TABLE #tempTable(id int);

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

SELECT * FROM #tempTable;
33
répondu Rob Willis 2012-08-10 10:12:10

votre table temp en SQL dynamique est hors de portée dans la partie SQL non dynamique.

voir ici comment traiter avec ceci: Un peu de sql server tables temporaires locales

6
répondu Mladen Prajdic 2011-11-07 17:28:03

Dans votre @sql chaîne, ne l'insérez pas into #TempTable. Au lieu de cela, appelez votre SELECT sans INSERT déclaration.

Enfin, insérer les résultats dans votre table temporaire comme suit:

INSERT INTO @tmpTbl EXEC sp_executesql @sql

en outre, vous devrez déclarer la table temporaire si vous utilisez cette approche

DECLARE @tmpTbl TABLE (
    //define columns here...
)
5
répondu Mark Entingh 2018-09-06 20:39:33

les tables temporaires ne vivent que tant que la connexion qui les crée. Je m'attendrais à ce que vous émettiez involontairement le select sur une connexion séparée. Vous pouvez tester cela en faisant momentanément votre insertion dans une table non-temporaire et en voyant si vos données sont là. Si c'est le cas, vous pouvez revenir à votre solution originale et juste être sûr de passer l'objet de connexion à votre sélection.

3
répondu Carth 2011-11-07 17:29:02

pour contourner ce problème, utilisez D'abord la commande CREATE TABLE #TEMPTABLE pour générer une table temp vide avant d'exécuter sp_executesql. Ensuite, Lancez L'INSERT dans #TEMPTABLE avec sp_executesql. Ce sera le travail. C'est comment j'ai surmonté ce problème que j'ai une installation dans laquelle toutes mes requêtes sont généralement exécuter via sp_executesql.

1
répondu Simon Darlow 2016-03-22 10:18:22
declare @sql varchar(1000)
set @sql="select * into #t from table;"
set @sql =@sql + "select * from #t;"

 execute  SP_EXECUTESQL  @sql
1
répondu Raviprasad Bettigeri 2016-05-31 12:13:28

Cela a fonctionné pour moi

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
1
répondu WebBoy 2018-08-21 20:05:52