Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server 2008:insira uma lista delimitada por vírgulas?


Eu sei que isso não responde à pergunta real, mas todas as soluções que vi para lidar com isso parecem um truque sujo para contornar as limitações anteriores de não poder passar vários valores para um procedimento. Desde a introdução de parâmetros com valor de tabela no sql-server 2008, não vejo razão para que uma string delimitada seja necessária no SQL:

O primeiro passo é criar seu tipo para conter os valores (costumo usar nomes genéricos para que possam ser reutilizados):
CREATE TYPE dbo.StringList AS TABLE (Value NVARCHAR(MAX));

Em seguida, crie seu procedimento:
CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.StringList READONLY
AS
    SELECT  Something
    FROM    MyTable
    WHERE   Org + '-' + OrgSub IN (SELECT Value FROM @OrgList);

GO

Então você pode chamar seu procedimento da seguinte forma
DECLARE @OrgList dbo.StringList;
INSERT @OrgList VALUES 
    ('2342342', '________', 'A'),
    ('5435354', '________', 'B');

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Isso daria até a oportunidade de criar uma tabela mais apropriada:
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

Então para executar
DECLARE @OrgList dbo.OrgList;
INSERT @OrgList VALUES 
    ('2342342', '________'),
    ('5435354', '________');

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Se for absolutamente necessário passar uma lista delimitada por vírgulas, você pode convertê-la para o Tipo StringList usando a conversão XML e usar o mesmo procedimento, mas usar um parâmetro com valor de tabela permite muito mais flexibilidade do que usar uma string delimitada:
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