sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server:Split operation

om du inte kan använda tabellvärdesparametrar, se:"Arrays and Lists in SQL Server 2008 Using Table-Valued Parameters" av Erland Sommarskog , så finns det många sätt att dela strängar i SQL Server. Den här artikeln täcker fördelarna och nackdelarna med nästan alla metoder:

"Arrays and Lists in SQL Server 2005 and Beyond, When Table Value Parameters Do Not Klipp den" av Erland Sommarskog

Du måste skapa en delad funktion. Så här kan en delad funktion användas:

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

Jag föredrar taltabellmetoden för att dela en sträng i TSQL men det finns många sätt att dela strängar i SQL Server, se föregående länk, som förklarar fördelarna och nackdelarna med var och en.

För att Numbers Table-metoden ska fungera måste du göra denna engångstabellinställning, vilket skapar en tabell Numbers som innehåller rader från 1 till 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)

När tabellen Numbers har ställts in skapar du den här delade funktionen:

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 

Du kan nu enkelt dela upp en CSV-sträng i en tabell och gå med i den:

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

UTGÅNG:

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

(3 row(s) affected)


  1. Hur får man MySql 8 att köra med laravel?

  2. Markörbaserad postdatatyp med markör som returnerar flera värden i Oracle-databasen

  3. Det går inte att infoga ett främmande nyckelvärde i länkningstabellen

  4. Om jag använder IN-operatorn för att filtrera NULL-värden och blanksteg Det fungerar inte Varför?