sql >> Database >  >> RDS >> Sqlserver

SQL Server 2008:voer een door komma's gescheiden lijst in?

Ik weet dat dit niet de eigenlijke vraag beantwoordt, maar alle oplossingen die ik heb gezien om dit aan te pakken, voelen als een vuile hack om de eerdere beperkingen van het niet kunnen doorgeven van meerdere waarden aan een procedure te omzeilen. Sinds de introductie van tabelwaardeparameters in sql-server 2008 zie ik geen reden waarom een ​​gescheiden string nodig zou zijn binnen SQL:

De eerste stap is om uw type te maken dat de waarden bevat (ik gebruik meestal generieke namen zodat ze opnieuw kunnen worden gebruikt):

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

Maak vervolgens uw procedure:

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

GO

Dan kunt u uw procedure als volgt oproepen

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

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Dit zou zelfs de mogelijkheid bieden om een ​​meer geschikte tafel te maken:

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

Om vervolgens uit te voeren

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

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Als het absoluut noodzakelijk is om een ​​door komma's gescheiden lijst door te geven, kunt u deze converteren naar het StringList Type met behulp van XML-conversie, en dezelfde procedure gebruiken, maar het gebruik van een tabelwaardeparameter zorgt voor veel meer flexibiliteit dan het gebruik van een gescheiden string:

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. Groepeer en tel waarden voor elk record in SQL

  2. Waarom krijg ik alle resultaten als ik een onderstrepingsteken in een LIKE-filter gebruik?

  3. hoe OperationalError op te lossen:(psycopg2.OperationalError) server heeft de verbinding onverwacht gesloten

  4. Hoe zich te ontdoen van MySQL-fout 'Voorbereide instructie moet opnieuw worden voorbereid'