sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server 2008:¿ingresar una lista delimitada por comas?

Sé que esto no responde a la pregunta real, pero todas las soluciones que he visto para manejar esto se sienten como un truco sucio para sortear las limitaciones anteriores de no poder pasar múltiples valores a un procedimiento. Desde la introducción de parámetros con valores de tabla en sql-server 2008, no veo ninguna razón por la que se necesite una cadena delimitada dentro de SQL:

El primer paso es crear su tipo para que contenga los valores (tiendo a usar nombres genéricos para que puedan reutilizarse):

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

Luego crea tu procedimiento:

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

GO

Entonces puede llamar a su procedimiento de la siguiente manera

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

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Esto incluso brindaría la oportunidad de crear una tabla más apropiada:

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

Luego para ejecutar

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

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Si es absolutamente necesario pasar una lista delimitada por comas, puede convertirla al tipo StringList usando la conversión XML y usar el mismo procedimiento, pero usar un parámetro con valores de tabla permite mucha más flexibilidad que usar una cadena 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