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?
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.
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;
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
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...
)
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.
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.
declare @sql varchar(1000)
set @sql="select * into #t from table;"
set @sql =@sql + "select * from #t;"
execute SP_EXECUTESQL @sql
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