Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wydajny sposób na dzielenie ciągów za pomocą CTE

Wyglądasz na martwego nastawionego na używanie CTE, więc spróbuj tego:

DECLARE @YourTable table (RowID int, Layout varchar(200))
INSERT @YourTable VALUES (1,'hello,world,welcome,to,tsql')
INSERT @YourTable VALUES (2,'welcome,to,stackoverflow')

;WITH SplitSting AS
(
    SELECT
        RowID,LEFT(Layout,CHARINDEX(',',Layout)-1) AS Part
            ,RIGHT(Layout,LEN(Layout)-CHARINDEX(',',Layout)) AS Remainder
        FROM @YourTable
        WHERE Layout IS NOT NULL AND CHARINDEX(',',Layout)>0
    UNION ALL
    SELECT
        RowID,LEFT(Remainder,CHARINDEX(',',Remainder)-1)
            ,RIGHT(Remainder,LEN(Remainder)-CHARINDEX(',',Remainder))
        FROM SplitSting
        WHERE Remainder IS NOT NULL AND CHARINDEX(',',Remainder)>0
    UNION ALL
    SELECT
        RowID,Remainder,null
        FROM SplitSting
        WHERE Remainder IS NOT NULL AND CHARINDEX(',',Remainder)=0
)
SELECT * FROM SplitSting ORDER BY RowID

WYJŚCIE:

RowID       Part                   
----------- -----------------------
1           hello                  
1           world                  
1           welcome                
1           to                     
1           tsql                   
2           welcome                
2           to                     
2           stackoverflow          

(8 row(s) affected)

oto doskonały artykuł na temat dzielenia ciągów w SQL Server:"Arrays and Lists in SQL Server 2005 i nowsze wersje, gdy parametry wartości tabeli go nie ograniczają” autorstwa Erlanda Sommarskoga

EDYTUJ tutaj jest inna wersja (ale potrzebujesz tabeli liczb) zwraca takie same wyniki jak powyżej:

;WITH SplitValues AS
(
    SELECT
        RowID,ListValue
        FROM (SELECT
                  RowID, LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(',', List2, number+1)-number - 1))) AS ListValue
                  FROM (
                           SELECT RowID, ',' + Layout + ',' AS List2
                           FROM @YourTable
                       ) AS dt
                      INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
                  WHERE SUBSTRING(List2, number, 1) = ','
             ) dt2
        WHERE ListValue IS NOT NULL AND ListValue!=''
)
SELECT * FROM SplitValues

zobacz tutaj tabelę liczb:Jaki jest najlepszy sposób tworzenia i wypełniania tabeli liczb?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy istnieje sposób wizualnego wyświetlania widoku na diagramie bazy danych w programie SQL Server 2008?

  2. Zgodność z usługami integracji serwerów SQL 2008-2005

  3. Unicode w SQL Server 2012 Express

  4. Jaki jest najlepszy sposób, aby umożliwić użytkownikowi dodawanie kolumn do bazy danych w locie?

  5. NHibernate Linq Group By nie grupuje poprawnie w SQL Server