Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Lewati struktur daftar sebagai argumen ke prosedur tersimpan

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:

"Array dan Daftar di SQL Server 2005 dan Selanjutnya, Ketika Parameter Nilai Tabel Tidak Potong" oleh Erland Sommarskog

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)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Permintaan untuk Hubungan Orang Tua Anak ke tingkat atas

  2. Cara terbaik untuk mengekstrak data dari xml dengan xquery

  3. Baris SQL ke Kolom

  4. Konversi Tipe Data Gambar Menjadi String di SQL Server

  5. Otentikasi jendela di server sql dan asp.net