Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server 2008 :saisissez une liste délimitée par des virgules ?

Je sais que cela ne répond pas à la vraie question, mais toutes les solutions que j'ai vues pour gérer cela ressemblent à un piratage sale pour contourner les limitations précédentes de ne pas pouvoir transmettre plusieurs valeurs à une procédure. Depuis l'introduction des paramètres de table dans sql-server 2008, je ne vois aucune raison pour laquelle une chaîne délimitée serait nécessaire dans SQL :

La première étape consiste à créer votre type pour contenir les valeurs (j'ai tendance à utiliser des noms génériques afin qu'ils puissent être réutilisés) :

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

Créez ensuite votre procédure :

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

GO

Ensuite, vous pouvez appeler votre procédure comme suit

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

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Cela permettrait même de créer un tableau plus approprié :

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

Puis exécuter

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

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

S'il est absolument nécessaire de transmettre une liste délimitée par des virgules, vous pouvez la convertir en type StringList à l'aide de la conversion XML et utiliser la même procédure, mais l'utilisation d'un paramètre de table offre beaucoup plus de flexibilité que l'utilisation d'une chaîne délimitée :

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