Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server 2008:inserire un elenco delimitato da virgole?

So che questo non risponde alla vera domanda, ma tutte le soluzioni che ho visto per gestirlo sembrano un trucco sporco per aggirare le precedenti limitazioni di non essere in grado di passare più valori a una procedura. Dall'introduzione dei parametri con valori di tabella in sql-server 2008 non vedo alcun motivo per cui sarebbe necessaria una stringa delimitata all'interno di SQL:

Il primo passo è creare il tuo tipo per contenere i valori (tendo a usare nomi generici in modo che possano essere riutilizzati):

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

Quindi crea la tua procedura:

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

GO

Quindi puoi chiamare la tua procedura come segue

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

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Ciò consentirebbe anche l'opportunità di creare una tabella più appropriata:

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

Quindi eseguire

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

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Se è assolutamente necessario passare un elenco delimitato da virgole, è possibile convertirlo nel tipo StringList utilizzando la conversione XML e utilizzare la stessa procedura, ma l'utilizzo di un parametro con valori di tabella consente una flessibilità molto maggiore rispetto all'utilizzo di una stringa delimitata:

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