sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server 2008:Indtast en kommasepareret liste?

Jeg ved, at dette ikke besvarer det faktiske spørgsmål, men alle de løsninger, jeg har set til at håndtere dette, føles som et beskidt hack for at komme uden om de tidligere begrænsninger for ikke at kunne overføre flere værdier til en procedure. Siden introduktionen af ​​tabelværdiparametre i sql-server 2008 kan jeg ikke se nogen grund til, hvorfor en afgrænset streng skulle være nødvendig i SQL:

Det første trin er at oprette din type til at indeholde værdierne (jeg plejer at bruge generiske navne, så de kan genbruges):

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

Opret derefter din procedure:

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

GO

Så kan du kalde din procedure som følger

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

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Dette ville endda give mulighed for at oprette en mere passende tabel:

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

Derefter for at udføre

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

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Hvis det er absolut nødvendigt for at sende en kommasepareret liste, kan du konvertere den til StringList Type ved hjælp af XML-konvertering og bruge den samme procedure, men brug af en tabelværdiparameter giver mulighed for meget mere fleksibilitet end at bruge en separeret streng:

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. Laravel Query Builder - Avancerede betingede klausuler (valgfri parametre)

  2. Sådan kontrollerer du størrelsen af ​​alle tabeller i en database i MySQL

  3. Flytning og sikkerhedskopiering af en stor MySQL-database

  4. SpringBoot+Kotlin+Postgres og JSONB:org.hibernate.MappingException:Ingen dialekttilknytning for JDBC-typen