web-dev-qa-db-fra.com

Passer le résultat de sélection comme paramètre de la procédure stockée

J'ai une procédure stockée T-SQL avec les paramètres suivants

CREATE PROCEDURE [dbo].[SaveData]
-- Add the parameters for the stored procedure here
    @UserID varchar(50),
    @ServiceID varchar(50),
    @param1 varchar(50),
    @param2 varchar(50),
    @endDate datetime
AS BEGIN
    . 
    .
    -- my code --

Je veux savoir s'il est possible de passer un résultat de select comme paramètre:

    exec SaveDate (SELECT player.UserID,player.ServiceID, 'no','no',GETDATE()
           FROM player)

J'ai essayé quelque chose comme ça, mais cela ne fonctionne pas.

20
GVillani82

La requête SELECT que vous avez écrite dans votre exemple ramènerait probablement plusieurs lignes (votre SELECT ne comporte ni clause WHERE ni TOP (n)). Si votre intention est de pouvoir engager votre procédure dans un ensemble de paramètres "tabulaires", à partir de SQL Server 2008, vous pouvez utiliser des paramètres de valeur de table.

Cela implique la création d'une table de table définie par l'utilisateur et signifie presque sans aucun doute l'ajustement de la logique à l'intérieur de la procédure stockée.

J'espère que cela t'aides :)

Voir http://msdn.Microsoft.com/en-us/library/bb510489 (SQL.100) .aspx pour plus d'informations.

5
MarkD

1.Une façon est:
a) Déclarez vos variables
b) Attribuez-leur des valeurs avec une seule instruction de sélection
c) Exécutez la procédure en passant les variables locales
d) Exécutez ce qui suit dans une boucle en utilisant WHILE ou CURSOR afin de l'appliquer à toutes les lignes du TABLEAU1

DECLARE @param1 <DATATYPE>, @param2 <DATATYPE>, ...

SELECT TOP 1 @param1 = col1,    @param2 = col2, ...
FROM TABLE1
WHERE <where_clause>

EXEC SaveDate @param1, @param2, ...

2.Une autre manière consiste à définir votre propre type de tableau, à le remplir et à le passer à la procédure. Cependant, cela nécessite de modifier un peu votre procédure stockée (dans la liste des paramètres, votre type personnalisé doit être suivi de READONLY):

CREATE TYPE [dbo].[TYPENAME] AS TABLE(
    [ID] [int] NOT NULL,
    ...
)
GO

DECLARE @myTypeVar TYPENAME;

INSERT @myTypeVar
SELECT col1, col2, ...
FROM TABLE1

EXEC SaveData @myTypeVar
15
Vladislav