Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Passaggio di più valori per un parametro SQL

Ci sono alcuni modi per farlo. Puoi passare il parametro come un BLOB XML come questo esempio:

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>'

Oppure passa i valori come CSV e usa una funzione di divisione per dividere i valori in una variabile di tabella (ci sono molte funzioni di divisione là fuori, una ricerca rapida ne genererà una).

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'

Se stavi utilizzando SQL 2008 o versioni successive, avresti potuto utilizzare i parametri con valori di tabella che ti consentono di passare una variabile TABLE come parametro. Ho bloggato su questi 3 approcci qualche tempo fa, con un rapido confronto delle prestazioni.