Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server 2008:wprowadź listę rozdzielaną przecinkami?

Wiem, że to nie odpowiada na rzeczywiste pytanie, ale wszystkie rozwiązania, które widziałem, aby sobie z tym poradzić, są jak brudny hack, aby ominąć poprzednie ograniczenia polegające na niemożności przekazania wielu wartości do procedury. Od czasu wprowadzenia parametrów o wartościach tabelarycznych w sql-server 2008 nie widzę powodu, dla którego oddzielony ciąg znaków byłby potrzebny w SQL:

Pierwszym krokiem jest utworzenie własnego typu, który będzie zawierał wartości (zwykle używam ogólnych nazw, aby można je było ponownie wykorzystać):

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

Następnie utwórz procedurę:

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

GO

Następnie możesz wywołać swoją procedurę w następujący sposób

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

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Dałoby to nawet możliwość stworzenia bardziej odpowiedniej tabeli:

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

Następnie wykonaj

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

EXECUTE dbo.GetFromTable @OrgList;

Skrzypce SQL

Jeśli jest to absolutnie konieczne, aby przekazać listę rozdzielaną przecinkami, możesz przekonwertować ją na typ StringList za pomocą konwersji XML i użyć tej samej procedury, ale użycie parametru o wartości tabeli pozwala na znacznie większą elastyczność niż użycie rozdzielanego ciągu:

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

Skrzypce SQL



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server:przecieki poziomu izolacji w połączeniach w puli

  2. Pobierz varbinary(MAX) z SQL Server do byte[] w C#

  3. Błędnie obliczona liczba tygodni i częściowych tygodni między dwoma dniami

  4. Jak programowo sprawdzić (przeanalizować) ważność instrukcji TSQL?

  5. Dlaczego powinienem uaktualnić SQL2000 do SQL2005?