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 :
- Séparez les chaînes dans le bon sens, ou mieux chemin
- Splitting Strings :A Follow-Up
- Séparer les chaînes :désormais avec moins de T-SQL
- Comparaison des méthodes de fractionnement/concaténation de chaînes
- Traitement d'une liste d'entiers :mon approche
- Diviser une liste d'entiers :un autre tour d'horizon
- En savoir plus sur le fractionnement des listes :délimiteurs personnalisés, prévention des doublons et maintien de l'ordre
- Suppression Doublons à partir de chaînes dans SQL Server
Sur SQL Server 2016 ou supérieur, cependant, vous devriez regarder STRING_SPLIT()
et STRING_AGG()
:
- Surprises et hypothèses de performances :STRING_SPLIT()
- STRING_SPLIT() dans SQL Server 2016 :Suite #1
- STRING_SPLIT() dans SQL Server 2016 :Suivi #2
- SQL Server v.Next :Performances de STRING_AGG()
- Résoudre les anciens problèmes avec les nouvelles fonctions STRING_AGG et STRING_SPLIT de SQL Server