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

Passer plusieurs valeurs pour un paramètre SQL

Il existe plusieurs façons de procéder. Vous pouvez transmettre le paramètre sous forme de blob XML, comme dans cet exemple :

CREATE PROCEDURE [dbo].[uspGetCustomersXML]
    @CustomerIDs XML
AS
BEGIN
SELECT c.ID, c.Name
FROM [dbo].[Customer] c
JOIN @CustomerIDs.nodes('IDList/ID') AS x(Item) ON c.ID = Item.value('.', 'int' )
END
GO

--Example Use:
EXECUTE [dbo].[uspGetCustomersXML] '<IDList><ID>1</ID><ID>10</ID><ID>100</ID></IDList>'

Ou transmettez les valeurs au format CSV et utilisez une fonction de fractionnement pour fractionner les valeurs dans une variable de table (il existe de nombreuses fonctions de fractionnement, une recherche rapide en générera une).

CREATE PROCEDURE [dbo].[uspGetCustomersCSV]
    @CustomerIDs VARCHAR(8000)
AS
BEGIN
SELECT c.Id, c.Name
FROM [dbo].[Customer] c
JOIN dbo.fnSplit(@CustomerIDs, ',') t ON c.Id = t.item
END
GO

--Example Use:
EXECUTE [dbo].[uspGetCustomersCSV] '1,10,100'

Si vous utilisiez SQL 2008 ou une version ultérieure, vous auriez pu utiliser des paramètres de valeur de table qui vous permettent de transmettre une variable TABLE en tant que paramètre. J'ai blogué sur ces 3 approches il y a quelque temps, avec une comparaison rapide des performances.