Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2008:Geben Sie eine durch Kommas getrennte Liste ein?

Ich weiß, dass dies die eigentliche Frage nicht beantwortet, aber alle Lösungen, die ich gesehen habe, um damit umzugehen, fühlen sich wie ein schmutziger Hack an, um die vorherigen Einschränkungen zu umgehen, dass nicht mehrere Werte an eine Prozedur übergeben werden können. Seit der Einführung von Tabellenwertparametern in SQL-Server 2008 sehe ich keinen Grund, warum eine Zeichenfolge mit Trennzeichen in SQL benötigt wird:

Der erste Schritt besteht darin, Ihren Typ zu erstellen, der die Werte enthält (ich neige dazu, generische Namen zu verwenden, damit sie wiederverwendet werden können):

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

Erstellen Sie dann Ihre Prozedur:

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

GO

Dann können Sie Ihre Prozedur wie folgt aufrufen

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

EXECUTE dbo.GetFromTable @OrgList;

SQL-Fiddle

Dies würde sogar die Möglichkeit bieten, eine geeignetere Tabelle zu erstellen:

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

Dann ausführen

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

EXECUTE dbo.GetFromTable @OrgList;

SQL-Fiddle

Wenn es absolut notwendig ist, eine kommagetrennte Liste zu übergeben, könnten Sie sie mithilfe der XML-Konvertierung in den StringList-Typ konvertieren und dasselbe Verfahren verwenden, aber die Verwendung eines Tabellenwertparameters bietet viel mehr Flexibilität als die Verwendung einer Zeichenfolge mit Trennzeichen:

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