sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server 2008:mata in en kommaavgränsad lista?

Jag vet att detta inte svarar på själva frågan, men alla lösningar jag har sett för att hantera detta känns som ett smutsigt hack för att komma runt de tidigare begränsningarna med att inte kunna skicka flera värden till en procedur. Sedan introduktionen av tabellvärderade parametrar i sql-server 2008 kan jag inte se någon anledning till varför en avgränsad sträng skulle behövas inom SQL:

Det första steget är att skapa din typ för att innehålla värdena (jag brukar använda generiska namn så att de kan återanvändas):

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

Skapa sedan din procedur:

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

GO

Sedan kan du ringa din procedur enligt följande

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

EXECUTE dbo.GetFromTable @OrgList;

SQL-fiol

Detta skulle till och med ge möjlighet att skapa en mer lämplig tabell:

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

Sedan för att köra

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

EXECUTE dbo.GetFromTable @OrgList;

SQL-fiol

Om det är absolut nödvändigt för att skicka en kommaavgränsad lista kan du konvertera den till StringList Type med XML-konvertering, och använda samma procedur, men att använda en tabellvärderad parameter ger mycket mer flexibilitet än att använda en avgränsad sträng:

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



  1. Mysql-drivrutinsproblem

  2. ExecuteNonQuery returnerar alltid noll. Kan jag använda detta 0-värde i min kod för validering?

  3. SQLAlchemy ordning efter funktionsresultat

  4. Hanterar mysqldump binär data på ett tillförlitligt sätt?