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

SQL Server 2008 :masukkan daftar yang dibatasi koma?

Saya tahu ini tidak menjawab pertanyaan yang sebenarnya, tetapi semua solusi yang saya lihat untuk menangani ini terasa seperti peretasan kotor untuk mengatasi batasan sebelumnya karena tidak dapat memberikan banyak nilai ke suatu prosedur. Sejak pengenalan parameter bernilai tabel di sql-server 2008 saya tidak melihat alasan mengapa string yang dibatasi diperlukan dalam SQL:

Langkah pertama adalah membuat tipe Anda untuk memuat nilai (saya cenderung menggunakan nama generik sehingga dapat digunakan kembali):

CREATE TYPE dbo.StringList AS TABLE (Value NVARCHAR(MAX));

Kemudian buat prosedur Anda:

CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.StringList READONLY
AS
    SELECT  Something
    FROM    MyTable
    WHERE   Org + '-' + OrgSub IN (SELECT Value FROM @OrgList);

GO

Kemudian Anda dapat memanggil prosedur Anda sebagai berikut

DECLARE @OrgList dbo.StringList;
INSERT @OrgList VALUES 
    ('2342342', '________', 'A'),
    ('5435354', '________', 'B');

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Ini bahkan akan memberikan kesempatan untuk membuat tabel yang lebih tepat:

CREATE TYPE dbo.OrgList AS TABLE(Org VARCHAR(10), OrgSub VARCHAR(10));

CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.OrgList READONLY
AS
    SELECT  Something
    FROM    MyTable
    WHERE   EXISTS
            (   SELECT  1
                FROM    @OrgList O
                WHERE   MyTable.Org = o.Org
                AND     MyTable.OrgSub = o.OrgSub
            );

GO

Kemudian untuk mengeksekusi

DECLARE @OrgList dbo.OrgList;
INSERT @OrgList VALUES 
    ('2342342', '________'),
    ('5435354', '________');

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Jika benar-benar diperlukan untuk melewatkan daftar yang dipisahkan koma, Anda dapat mengonversinya ke Tipe StringList menggunakan konversi XML, dan menggunakan prosedur yang sama, tetapi menggunakan parameter bernilai tabel memungkinkan lebih banyak fleksibilitas daripada menggunakan string yang dibatasi:

DECLARE @S VARCHAR(MAX) = '2342342-________,5435354-________,_______-________';

DECLARE @OrgList dbo.StringList;
INSERT @OrgList
SELECT  Y.value('.', 'NVARCHAR(MAX)')
FROM    (SELECT [X] = CAST(('<X>' + REPLACE(@S, ',' ,'</X><X>')+'</X>') AS XML)) X
        CROSS APPLY X.nodes('X') AS y (Y)

EXECUTE GetFromTable @OrgList

SQL Fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbaiki "Konversi gagal saat mengonversi nilai varchar" Saat Mencoba Menggabungkan di SQL Server

  2. Menyiapkan dan Mengonfigurasi Replikasi SQL Server

  3. Mengonversi Antara Tipe Data Tanggal &Waktu di SQL Server (Contoh T-SQL)

  4. Perbedaan penanganan spasi antara Oracle dan SQL Server

  5. File FILESTREAM tertinggal setelah baris dihapus