2010-03-30 3 views
1

J'importe un résultat intermédiaire de requête dans une table temporaire pour une utilisation ultérieure, alors j'utilisé une table de #temp pour maintenir le même schéma quecréer dynamiquement la table de #temp et ensuite utilisé pour insérer les données

select * into # temp from schema.tableName where 1<>1; 

insert into # temp from exec(table) 

Alors que je fais cette déclaration comme une variable pour passer les différents tableName son ne fonctionne pas

SET @TEMPSCHEMA = 'SELECT * INTO #temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1;' 

exec(@TEMPSCHEMA) 


INSERT INTO #temp 

EXEC (@SELECTSTATEMENT 

) 

mais après instruction exec, il ne prend pas les valeurs à la table temporaire.

il montre l'ID d'objet non valide #temp

+0

Si vous exécutez @selectstatement, retourne-t-il des lignes? –

Répondre

3

En effet, la portée de la déclaration EXEC est différente de la portée de la sproc contenant. C'est-à-dire que votre appel à EXEC crée la table temporaire, puis elle est automatiquement supprimée à mesure que la portée du EXEC reste. Vous avez essentiellement à faire le tout à l'intérieur du uneEXEC déclaration:

DECLARE @sql VARCHAR(MAX) 
SET @sql = 'SELECT * INTO #temp 
      FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1 
      INSERT INTO #temp ...' 

EXEC(@sql) 
1

Une fois que le SQL dynamique termine l'exécution, la table temporaire locale est hors de portée.

Il faudrait faire quelque chose comme ceci:

-- everything w/ dynamic sql 
SET @TEMPSCHEMA = ' 
    SELECT * INTO #temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1; 
    INSERT INTO #temp EXEC (@SELECTSTATEMENT) 
    SELECT .... -- whatever else you need to do 
    ' 

exec sp_executesql @TEMPSCHEMA, N'@SELECTSTATEMENT NVARCHAR(MAX)', @SELECTSTATEMENT 

ou

-- global temp table rather than local 
SET @TEMPSCHEMA = 'SELECT * INTO ##temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1;' 
exec(@TEMPSCHEMA) 

INSERT INTO ##temp EXEC (@SELECTSTATEMENT) 
+0

Merci pour tout de vous, J'ai utilisé la table temporaire de golbal qui a résolu mon problème. idéal pour apprendre de tous merci prav – prav

+1

Rappelez-vous que les tables temporaires globales peuvent être consultées par d'autres utilisateurs dans d'autres sessions. Vous pourriez vous retrouver avec deux utilisateurs qui font la même chose et qui s'influencent mutuellement. – HLGEM

0

Est-ce que exec (@TEMPSCHEMA) exécuter sous un autre contexte pour vous procédure et donC#temp cesse de existe-t-il dès que l'exec est terminé?

Ah oui, here it is

  • Dans la procédure stockée ou un déclencheur, toutes les déclarations qui contiennent le nom d'une table temporaire doit faire référence à une table temporaire créée dans la même procédure stockée. La table temporaire ne peut pas avoir été créée dans une procédure stockée appelante ou appelée, ou dans une chaîne exécutée à l'aide de EXECUTE ou sp_executesql.
1

Je suis l'importation d'un résultat intermédiaire de la requête dans une table temporaire pour une utilisation plus

Cette partie est presque toujours une erreur. Pouvez-vous partager ce que vous prévoyez de faire dans la prochaine étape ou les deux? Les chances sont, nous pouvons réécrire cela à tous arriver dans la même déclaration.

1

Exécution Les instructions dynamiques devant insérer des données dans une table temporaire à l'aide de l'instruction into ne sont pas prises en charge. Créer la table temporaire plus tôt, puis utiliser la requête dynamique à insérer dans la table temporaire fonctionnera correctement. la raison en est lorsque l'instruction exec() est utilisée est exécutée dans un contexte enfant et une fois le contexte fermé, la table temporaire dynamique est également perdue.

Questions connexes