2009-10-08 9 views
2

Je dois stocker le jeu de résultats d'une procédure stockée dans une table temporaire (à l'aide de SQL Server 2000). D'après ce que j'ai lu, ce (mal construit par exemple) devrait fonctionner:Comment enregistrer un ensemble de résultats unique dans une table temporaire à partir d'une procédure stockée SQL renvoyant plusieurs ensembles?

create table #tempTable (TempId int primary key, Column1 varchar(100), 
Column2 varchar(100), DateCreated datetime) 

insert into #tempTable (TempId, Column1, Column2, DateCreated) 
exec sproc_Select_Stuff_By_DateCreated @Date1 = '1/1/2009', @Date2 = '1/2/2009' 

mais je reçois: « Insérer Erreur: Nom de la colonne ou le nombre de valeurs fournies ne correspond pas à la définition de la table. »

examen de la procédure (que je ne peux pas modifier) ​​révèle ceci:

CREATE PROCEDURE sproc_Select_Stuff_By_DateCreated 

@Date1 datetime, 
@Date2 datetime 
AS 

BEGIN 

SELECT TempId, Column1, Column2, DateCreated 
FROM ReallyHugeMessOfJoinsAndCalculatedColumns 
WHERE DateCreated between @Date1 and @Date2 

SELECT @Date1 as Date1, @Date2 as Date2 

END 

Il est donc écho en fait revenir les paramètres passés dans comme un second jeu de résultats. (Je ne sais pas pourquoi, j'imagine que tout ce qui appelle la procédure sait quelles données elle transmet.)

Mes tests me portent à penser que le second jeu de résultats est à l'origine de l'échec de l'insertion - comme SQL essaie d'unir les ensembles de résultats ensemble et échoue.

J'ai seulement besoin du premier jeu de résultats sauvegardé dans ma table temporaire. Comment puis je faire ça?

Modifier

Merci de remarquer proecedures stockées CLR, mais cette fonctionnalité a été introduite dans SQL 2005 - il ne fonctionnera pas pour 2000. (Mais je n'avait pas connaissance d'entre eux, et ils regardent comme ils seront utiles lorsque nous mettrons à niveau.)

Comme les seules autres réponses semblent être "vous ne pouvez pas" - je suppose que c'est de retour à la planche à dessin pour moi.

+0

peut vous envoyer des résultats de la procédure stockée? –

+0

Voir cette question connexe: Brannon

+0

Cette question a une solution de contournement en utilisant le CLR –

Répondre

2

puisque vous ne pouvez pas changer la procédure stockée, vous avez seulement deux options:

  • utiliser un CLR, qui peut capturer les deux ensembles de résultats, et de retour que celui que vous voulez.
  • dupliquez la requête dont vous avez besoin dans votre propre procédure ou vue.C'est un vrai hack, et le CLR est préféré. Cependant, vous n'avez pas beaucoup de choix.
0

Vous trouverez ci-dessous un exemple complet et fonctionnel (pour SQL 2005) de ce dont vous parlez. Les mauvaises nouvelles sont, je ne crois pas qu'il n'y ait aucun moyen de faire ce que vous essayez de faire. Pardon. Il semble que l'auteur de SP l'ait rendu impossible.

Si quelqu'un trouve un moyen créatif de faire ce travail, génial!

IF OBJECT_ID('tempdb..#tempTable') IS NOT NULL 
    DROP TABLE #tempTable 
GO 
IF EXISTS (SELECT * FROM sys.procedures WHERE name = 'sproc_Select_Stuff_By_DateCreated') 
    DROP PROCEDURE dbo.sproc_Select_Stuff_By_DateCreated 
GO 
CREATE PROCEDURE dbo.sproc_Select_Stuff_By_DateCreated 
    @Date1 datetime, 
    @Date2 datetime 
AS BEGIN 
    ;WITH t AS (
     SELECT 
      1      AS TempId, 
      'Column1-val1'   AS Column1, 
      'Column2-val1'   AS Column2, 
      '2009-01-01 10:00:00' AS DateCreated 
     UNION ALL 
     SELECT 
      2, 
      'Column1-val2', 
      'Column2-val2', 
      '2009-01-01 11:00:00' 
    ) 
    SELECT 
     TempId, 
     Column1, 
     Column2, 
     DateCreated 
    FROM t -- ReallyHugeMessOfJoinsAndCalculatedColumns 
    WHERE DateCreated between @Date1 and @Date2 

    SELECT @Date1 as Date1, @Date2 as Date2 
END 
GO 

create table #tempTable (
    TempId int primary key, 
    Column1 varchar(100), 
    Column2 varchar(100), 
    DateCreated datetime 
) 

insert into #tempTable (TempId, Column1, Column2, DateCreated) 
exec dbo.sproc_Select_Stuff_By_DateCreated 
    @Date1 = '1/1/2009', 
    @Date2 = '1/2/2009' 

--SELECT * FROM #tempTable 

---------------------------------------- 

Msg 213, Level 16, State 7, Procedure sproc_Select_Stuff_By_DateCreated, Line 26 
Insert Error: Column name or number of supplied values does not match table definition. 
1

Généralement, en langage SQL, cela n'est pas possible. Le lien de Brannon donne une solution de contournement possible en utilisant le CLR. D'autre part, si le ré-affacturage est une option, pensez à rendre la première requête atomique dans sa propre procédure stockée. Ensuite, il peut être appelé à partir de la procédure stockée existante et de tout autre code. Votre code est toujours à un seul endroit, rien n'est cassé, et vous obtenez quelque chose qui peut être plus facilement utilisé à partir de SQL pur. Selon sa fonction, la première partie du SP pourrait même être un bon candidat pour une fonction de table en ligne (j'ai trouvé que c'était bien performant et flexible). Ensuite, vous n'avez même pas besoin de pour capturer la sortie dans une table temporaire pour l'utiliser comme table dans d'autres traitements (bien que vous pourriez vouloir l'utiliser plusieurs fois)!

-1

De l'Microsoft T-SQL reference

INSERT EmployeeSales 
EXECUTE uspGetEmployeeSales; 
GO 
+0

Uh, cela ne fonctionne pas dans ce cas. Lire le post. –