2010-05-17 5 views
1

Fondamentalement, j'ai un type de table défini par l'utilisateur (pour une utilisation en tant que variable de table) que je référence dans une procédure stockée qui appelle effectivement deux autres procédures stockées, puis insère les valeurs dans le type de table.T-SQL hors service insert

id est

INSERT INTO @tableValuedVariable (var1, var2, var3, var4, var5) 
     EXEC [dbo].StoredProcedure1; 

INSERT INTO @tableValuedVariable (var1, var2, var5) 
     EXEC [dbo].StoredProcedure2; 

Vous pouvez probablement déjà dire ce que je vais demander. Fondamentalement, StoredProcedure2 ne renvoie que quelques-unes des valeurs que la table contient, et j'aimerais que ces autres variables soient simplement nulles (définies par défaut). Seul SQL se plaint que je ne spécifie pas toutes les variables disponibles pour cette table. Les ensembles de données de retour peuvent être assez importants, donc je voudrais éviter les boucles et autres pour des raisons évidentes.

Merci pour toute aide.

Répondre

1

Vous avez la liste de toutes les colonnes de la clause INSERT pour correspondre à toutes les colonnes de la procédure stockée.

Maintenant, si le proc stocké retourne var1, var2, var5 alors il ne devrait pas être nécessaire de spécifier var3, var4 dans la clause INSERT si elles sont NULLable. (Edit: bien sûr, comme Mike Burton l'a souligné, il échouera si les colonnes ne sont pas NULL)

Si la procédure stockée retourne var1, var2, var3, var4, var5 alors vous avez besoin de tous les 5 dans la clause INSERT: vous ne pouvez pas ignorer les colonnes de la proc stocké et leur permettre de par défaut.

Vous pouvez changer la procédure stockée à un udf et SELECT var1, var2, var5 FROM mynewUDF()

+1

Et, bien sûr, si l'une des colonnes ignorées sont NOT NULL, la requête échouera. –

0

Cela fonctionne pour moi:

CREATE PROCEDURE prc_test_1 
AS 
     SELECT 1 AS id, 2 AS id2 

GO 

CREATE PROCEDURE prc_test_2 
AS 
     SELECT 1 AS id 

GO 

DECLARE @tv TABLE (id INT, id2 INT) 

INSERT 
INTO @tv 
EXEC prc_test_1 

INSERT 
INTO @tv (id) 
EXEC prc_test_2 

SELECT * 
FROM @tv