Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Procédure stockée avec un nombre variable de paramètres

Vous pouvez le transmettre sous forme de liste séparée par des virgules, puis utiliser une fonction de fractionnement et joindre les résultats.

CREATE FUNCTION dbo.SplitInts
(
   @List       VARCHAR(MAX),
   @Delimiter  CHAR(1)
)
RETURNS TABLE
AS
   RETURN 
   (
       SELECT Item = CONVERT(INT, Item)
       FROM
       (
           SELECT Item = x.i.value('(./text())[1]', 'INT')
           FROM
           (
               SELECT [XML] = CONVERT(XML, '<i>' 
                    + REPLACE(@List, @Delimiter, '</i><i>') 
                    + '</i>').query('.')
           ) AS a
           CROSS APPLY
           [XML].nodes('i') AS x(i)
       ) AS y
       WHERE Item IS NOT NULL
   );

Maintenant votre procédure stockée :

CREATE PROCEDURE dbo.doStuff
    @List VARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT cols FROM dbo.table AS t
        INNER JOIN dbo.SplitInts(@List, ',') AS list
        ON t.ID = list.Item;
END
GO

Ensuite pour l'appeler :

EXEC dbo.doStuff @List = '1, 2, 3, ...';

Vous pouvez voir des informations générales, d'autres options et des comparaisons de performances ici :

Sur SQL Server 2016 ou supérieur, cependant, vous devriez regarder STRING_SPLIT() et STRING_AGG() :