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

SQL Server:operazione divisa

se non è possibile utilizzare i parametri del valore della tabella, vedere:"Array ed elenchi in SQL Server 2008 con parametri con valori di tabella" di Erland Sommarskog , ci sono molti modi per dividere la stringa in SQL Server. Questo articolo copre i PRO ei CONTRO di quasi tutti i metodi:

"Array ed elenchi in SQL Server 2005 e versioni successive, quando i parametri del valore della tabella non lo fanno Taglialo" di Erland Sommarskog

Devi creare una funzione di divisione. Ecco come è possibile utilizzare una funzione di divisione:

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

Preferisco l'approccio della tabella dei numeri per dividere una stringa in TSQL ma ci sono molti modi per dividere le stringhe in SQL Server, vedi il link precedente, che spiega i PRO ei CONTRO di ciascuno.

Affinché il metodo della tabella dei numeri funzioni, devi eseguire questa configurazione dell'orario una tantum, che creerà una tabella Numbers che contiene righe da 1 a 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)

Una volta impostata la tabella dei numeri, crea questa funzione di divisione:

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 

Ora puoi facilmente dividere una stringa CSV in una tabella e unirti ad essa:

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

USCITA:

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

(3 row(s) affected)