sql >> Databáze >  >> RDS >> Sqlserver

SQL Server 2008:zadat seznam oddělený čárkami?

Vím, že to neodpovídá na skutečnou otázku, ale všechna řešení, která jsem viděl, aby to zvládla, mi připadají jako špinavý hack, jak obejít předchozí omezení nemožnosti předat postupu více hodnot. Od zavedení tabulkových hodnot parametrů v SQL-server 2008 nevidím žádný důvod, proč by byl v SQL potřeba oddělený řetězec:

Prvním krokem je vytvořit typ, který bude obsahovat hodnoty (mám tendenci používat obecná jména, aby je bylo možné znovu použít):

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

Poté vytvořte svůj postup:

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

GO

Poté můžete svou proceduru zavolat následovně

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

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

To by dokonce umožnilo vytvořit vhodnější tabulku:

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

Poté proveďte

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

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Pokud je absolutně nutné předat seznam oddělený čárkami, můžete jej převést na typ StringList pomocí převodu XML a použít stejný postup, ale použití parametru s hodnotou tabulky umožňuje mnohem větší flexibilitu než použití řetězce s oddělovači:

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. Testování vrstvy ODBC

  2. Lepší způsob než více příkazů SELECT?

  3. Python peewee save() nefunguje podle očekávání

  4. MYSQL dotaz k získání rozdílu data