Exécuter sp_executeSql pour sélectionner...dans le #table, mais ne Peut pas Sélectionner Temp Données de la Table
A été d'essayer de sélectionner...dans une Table temporaire #TempTable dans sp_Executedsql.
Pas de son avec succès insérés ou non, mais il y a des Messages d'il y a écrit
(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 avoir exécuté,sa me rendre sur les messages (359 ligne(s) affectée).
Suivant lorsque vous essayez de sélectionner les données à partir de #TempTable.
Select * From #TempTable;
Son retour moi:
Msg 208, Level 16, State 0, Line 2
Invalid object name '#TempTable'.
Soupçonné son travail uniquement le "select" section ne. L'insert ne fonctionne pas.
comment résoudre ce problème?
Vous devez vous connecter pour publier un commentaire.
Table temporaire locale
#table_name
est visible dans la session en cours, global temporaire##table_name
tableaux sont visibles dans toutes les sessions. Les deux vies jusqu'à ce que la session est fermée.sp_executesql
- crée sa propre session (peut-être le mot "portée" serait mieux), donc c'est pourquoi il arrive.DECLARE @sql NVARCHAR(MAX); SET @sql = 'SELECT @@SPID'; EXECUTE sp_executesql @sql; SELECT @@SPID
INSERT INTO @tmpTbl EXEC sp_executesql @sql
sp_executesql
n' pas créer sa propre session. Plutôt, il crée son propre lot (ou contexte d'exécution). Tables Temp peut être vu par d'autres lots dans la même session. Cependant, parce qu'ils sont supprimés lorsque le lot qui les a créés sorties, pratiquement parlant, ils ne peuvent être vus par les actions subalternes à lots (c'est à dire, des contextes d'exécution créé par le même contexte qui a créé la table temporaire).À l'aide d'une table temporaire globale dans ce scénario pourrait causer des problèmes comme la table n'existe pas, entre les sessions, et peut entraîner certains problèmes avec le code d'appel asynchrone.
Une table temporaire locale peut être utilisée si elle définie avant d'appeler sp_executesql par exemple
Dans votre
@sql
chaîne, ne l'insérez pasinto #TempTable
. Au lieu de cela, appelez votreSELECT
déclaration sansINSERT
déclaration.Enfin, insérer les résultats dans votre table temporaire comme suit:
Aussi, vous aurez besoin de déclarer la table temporaire si vous utilisez cette approche
select ... into ... #TempTable ...
va réellement créer la table temporaire, y compris les spec-ing les colonnes dynamiquement. Pour que votre déclaration de travail, la table temporaire (ou une variable de table, que vous utilisez) doit être créé ou déclaré le premier (avec un bon/correspondance colonne specs).votre temp table dans SQL dynamique est hors de portée dans la non SQL dynamique de la partie.
Regardez ici comment faire face à cette: Un peu de sql server tables temporaires locales
Tables temporaires seulement de vivre aussi longtemps que la connexion qui les crée. Je m'attends à ce que vous êtes involontairement la délivrance de la sélectionner sur une connexion distincte. Vous pouvez le tester par momentanément de faire vos insérer dans une autre table temporaire et de voir 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 un CREATE TABLE #TEMPTABLE d'abord la commande pour générer un vide de la table temporaire avant d'exécuter sp_executesql. Exécutez ensuite l'INSÉRER 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.
Cela a fonctionné pour moi