2009-09-17 6 views
1

J'ai créé un gestionnaire de connexion ADO.NET et une source DataReader avec la commande SQL suivante:Utilisation des tables temporaires dans SSIS

select 
    'test' as testcol 
INTO 
    #tmp 

select * from #tmp 

Si je clique sur le bouton de rafraîchissement dans le composant DataReader, je reçois SqlException "Nom d'objet invalide #tmp". La déclaration SQL elle-même est clairement valide et s'exécute correctement dans SQL Server Management Studio. J'ai également essayé de définir DelayValidation sur le gestionnaire de connexion, en vain.

+0

Je n'ai pas travaillé avec SSIS. Mais, est-il possible que #tmp ne soit pas créé en raison d'autorisations à l'utilisateur/contexte à l'aide duquel la tâche SSIS peut s'exécuter? – shahkalpesh

+0

Je ne suis pas sûr, mais je pense que j'obtiendrais une erreur d'autorisation si c'était le cas. – Jeremy

Répondre

2

est l'erreur sur l'INSERT ou le SELECT?

Si vous n'émettez qu'une commande contenant INSERT et SELECT, essayez de placer un point-virgule avant le SELECT.

EDIT après OP commentaire
résumer toute la logique dans une procédure stockée:

CREATE PROCEDURE YourProcedureName 
AS 
select 
    'test' as testcol 
INTO 
    #tmp 

select * from #tmp 

GO 

l'ont votre application exécuter cette seule commande SQL:

exec YourProcedureName 

EDIT après le prochain Commentaire OP

OP ne dit pas la version SQL Server qu'ils utilisent, si 2005 ou, essayez un CTE:

;with CTEtemp as 
(
select 
    'test' as testcol 
) 
select * from CTEtemp 
+0

Le point-virgule ne semble pas aider. – Jeremy

+0

Vrai, un proc stocké serait tellement plus facile. Malheureusement, notre groupe de serveurs m'empêche de créer des procédures stockées sur ce serveur sql, et si je mets un proc stocké sur un autre serveur, les jointures entre les serveurs seraient sous-optimales. – Jeremy

+0

Heureusement, j'ai été capable de retravailler la requête pour ne pas avoir besoin de tables temporaires, mais je suis toujours intéressé par la façon de faire cela dans SSIS parce que cela me semble être une lacune absolue si vous me le demandez. – Jeremy

0

Pourquoi ne pourrait-il être remplacé par un « SELECT « test » comme testcol »? L'analyseur de requête SSIS peut rencontrer des problèmes car une table temporaire est impliquée et attend une seule instruction, pas un script SQL réel. Ou, si ce que vous partagez ci-dessus est seulement un exemple d'illustration, peut-être quelque chose comme ceci:

SELECT * 
    FROM (SELECT 'test' AS testcol) 

Pouvez-vous préciser ce que vous essayez d'accomplir ici et, si elle est, pourquoi la table temporaire est requis?

+0

C'était juste un exemple simplifié. Dans ma situation réelle, j'ai besoin de la table temporaire, mais j'ai utilisé cet exemple pour plus de simplicité. – Jeremy

0

Utilisez sp_executesql

Votre commande deviendrait

exec sp_executesql @statement=N' 
select 
    ''test'' as testcol 
INTO 
    #tmp 

select * from #tmp' 

Vous devez utiliser la chaîne nvarchar (d'où le N), et échapper à des guillemets simples en les doublant.

J'ai eu le même problème que vous et voici comment je l'ai juste réparé.

+0

Voici une réponse qui n'a pas fonctionné pour moi malgré mes meilleurs espoirs. Cela n'a aucun sens que ça n'a pas marché. Mais encore une fois, c'est pourquoi je fais mon ETL en C# brut avec SqlBulkCopy et d'autres fonctions d'aide ces jours-ci. SSIS est trop bouffant pour un codeur. Je pourrais libérer ma bibliothèque ETL un jour sur NuGet. – Todd

Questions connexes