Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Übergeben mehrerer Werte für einen SQL-Parameter

Dafür gibt es mehrere Möglichkeiten. Sie könnten den Parameter wie in diesem Beispiel als XML-Blob übergeben:

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

Oder übergeben Sie die Werte als CSV-Datei und verwenden Sie eine Aufteilungsfunktion, um die Werte in eine Tabellenvariable aufzuteilen (es gibt viele Aufteilungsfunktionen, die Schnellsuche wird eine hervorrufen).

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'

Wenn Sie SQL 2008 oder höher verwendet haben, hätten Sie Tabellenwertparameter verwenden können, mit denen Sie eine TABLE-Variable als Parameter übergeben können. Ich habe gebloggt über diese 3 Ansätze vor einiger Zeit, mit einem schnellen Leistungsvergleich.