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

SQL Server:Rozdělit operaci

pokud nemůžete použít parametry tabulky hodnot, viz:"Pole a seznamy v SQL Server 2008 Using Table-Valued Parameters" od Erlanda Sommarskoga , pak existuje mnoho způsobů, jak rozdělit řetězec na SQL Server. Tento článek popisuje výhody a nevýhody téměř každé metody:

"Pole a seznamy v SQL Server 2005 a novějších, když parametry hodnoty tabulky nefungují Cut it“ od Erlanda Sommarskoga

Musíte vytvořit funkci rozdělení. Takto lze použít funkci rozdělení:

SELECT
    *
    FROM YourTable                               y
    INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value

Dávám přednost přístupu číselné tabulky k rozdělení řetězce v TSQL ale existuje mnoho způsobů, jak rozdělit řetězce na serveru SQL Server, viz předchozí odkaz, který vysvětluje výhody a nevýhody každého z nich.

Aby metoda tabulky čísel fungovala, musíte provést toto jednorázové nastavení časového rozvrhu, které vytvoří tabulku Numbers který obsahuje řádky od 1 do 10 000:

SELECT TOP 10000 IDENTITY(int,1,1) AS Number
    INTO Numbers
    FROM sys.objects s1
    CROSS JOIN sys.objects s2
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)

Jakmile je tabulka Čísla nastavena, vytvořte tuto funkci rozdělení:

CREATE FUNCTION [dbo].[FN_ListToTable]
(
     @SplitOn  char(1)      --REQUIRED, the character to split the @List string on
    ,@List     varchar(8000)--REQUIRED, the list to split apart
)
RETURNS TABLE
AS
RETURN 
(

    ----------------
    --SINGLE QUERY-- --this will not return empty rows
    ----------------
    SELECT
        ListValue
        FROM (SELECT
                  LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue
                  FROM (
                           SELECT @SplitOn + @List + @SplitOn AS List2
                       ) AS dt
                      INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
                  WHERE SUBSTRING(List2, number, 1) = @SplitOn
             ) dt2
        WHERE ListValue IS NOT NULL AND ListValue!=''

);
GO 

Nyní můžete snadno rozdělit řetězec CSV do tabulky a připojit se k ní:

select * from dbo.FN_ListToTable(' ','stack over flow')

VÝSTUP:

ListValue
-------------------
stack
over
flow

(3 row(s) affected)


  1. Pochopení podpory Java pro perzistenci s JPA

  2. ORA-24408:Nelze vygenerovat jedinečný název skupiny serverů

  3. Jaké je umístění klienta mysql .my.cnf v XAMPP pro Windows?

  4. Jak najdu rozsah celých čísel v PostgreSQL?