Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server 2008:въвеждане на списък, разделен със запетая?

Знам, че това не отговаря на действителния въпрос, но всички решения, които съм виждал, за да се справят с това, се чувстват като мръсен хак за заобикаляне на предишните ограничения да не можеш да предаваш множество стойности на процедура. След въвеждането на параметри с таблични стойности в sql-server 2008 не виждам причина защо в SQL е необходим ограничен низ:

Първата стъпка е да създадете вашия тип, който да съдържа стойностите (склонен съм да използвам общи имена, за да могат да се използват повторно):

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

След това създайте своята процедура:

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

GO

След това можете да извикате вашата процедура, както следва

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

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Това дори ще даде възможност за създаване на по-подходяща таблица:

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

След това да се изпълни

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

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Ако е абсолютно необходимо да подадете разделен със запетая списък, можете да го конвертирате в типа StringList с помощта на XML преобразуване и да използвате същата процедура, но използването на параметър със стойност на таблица позволява много повече гъвкавост, отколкото използването на разделен низ:

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. SQL Server 2005 - Ред на вътрешните съединения

  2. вмъкнете подниз в нова колона

  3. Как да изпълня IF...THEN в SQL SELECT?

  4. Как да коригирате „Сървърът не е конфигуриран за RPC“ Msg 7411 с помощта на T-SQL

  5. прикачената база данни е само за четене