Anda memerlukan cara untuk memisahkan dan memproses string di TSQL, ada banyak cara untuk melakukannya. Artikel ini membahas PRO dan Kontra dari hampir setiap metode:
Anda perlu membuat fungsi split. Ini adalah bagaimana fungsi split dapat digunakan:
SELECT
*
FROM YourTable y
INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value
Saya lebih suka pendekatan tabel angka untuk membagi string di TSQL tetapi ada banyak cara untuk memisahkan string di SQL Server, lihat tautan sebelumnya, yang menjelaskan PRO dan KONTRA masing-masing.
Agar metode Tabel Angka berfungsi, Anda perlu melakukan pengaturan tabel satu kali ini, yang akan membuat tabel Numbers
yang berisi baris dari 1 hingga 10.000:
SELECT TOP 10000 IDENTITY(int,1,1) AS Number
INTO Numbers
FROM sys.objects s1
CROSS JOIN sys.objects s2
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)
Setelah tabel Numbers diatur, buat fungsi split ini:
CREATE FUNCTION [dbo].[FN_ListToTableRows]
(
@SplitOn char(1) --REQUIRED, the character to split the @List string on
,@List varchar(8000)--REQUIRED, the list to split apart
)
RETURNS TABLE
AS
RETURN
(
----------------
--SINGLE QUERY-- --this will return empty rows, and row numbers
----------------
SELECT
ROW_NUMBER() OVER(ORDER BY number) AS RowNumber
,LTRIM(RTRIM(SUBSTRING(ListValue, number+1, CHARINDEX(@SplitOn, ListValue, number+1)-number - 1))) AS ListValue
FROM (
SELECT @SplitOn + @List + @SplitOn AS ListValue
) AS InnerQuery
INNER JOIN Numbers n ON n.Number < LEN(InnerQuery.ListValue)
WHERE SUBSTRING(ListValue, number, 1) = @SplitOn
);
GO
Anda sekarang dapat dengan mudah membagi string CSV menjadi tabel dan bergabung di dalamnya. Untuk menyelesaikan tugas Anda, jika Anda dapat memasukkan dua parameter, salah satu kunci salah satu nilai, lalu buat prosedur Anda seperti ini:
CREATE PROCEDURE StoredProcedureName
(
@Params1 int
,@Array1 varchar(8000)
,@Params2 int
,@Array2 varchar(8000)
)
AS
DECLARE @YourTable table (col1 int, col2 int)
INSERT INTO @YourTable
(col1, col2)
SELECT
a1.ListValue, a2.ListValue
FROM dbo.FN_ListToTableRows(',',@Array1) a1
INNER JOIN dbo.FN_ListToTableRows(',',@Array2) a2 ON a1.RowNumber=a2.RowNumber
select * from @YourTable
GO
mengujinya:
exec StoredProcedureName 17,'127,204,110,198',7,'162,170,163,170'
KELUARAN:
(4 row(s) affected)
col1 col2
----------- -----------
127 162
204 170
110 163
198 170
(4 row(s) affected)
atau jika Anda ingin memasukkan pasangan nilai kunci parameter tunggal gunakan sesuatu seperti ini:
CREATE PROCEDURE StoredProcedureName
(
@KeyValueList varchar(8000)
)
AS
DECLARE @YourTable table (RowKey varchar(500), RowValue varchar(500))
INSERT INTO @YourTable
(RowKey, RowValue)
SELECT
LEFT(y.ListValue,CHARINDEX(',',y.ListValue)-1),RIGHT(y.ListValue,LEN(y.ListValue)-CHARINDEX(',',y.ListValue))
FROM dbo.FN_ListToTableRows(';',@KeyValueList) y
SELECT * FROM @YourTable
GO
jalankan:
exec StoredProcedureName 'a,5;b,BBB;abc,xyz'
KELUARAN:
RowKey RowValue
------- -----------
a 5
b BBB
abc xyz
(3 row(s) affected)