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

jak podzielić i wstawić dane CSV do nowej tabeli w jednym oświadczeniu?

Potrzebujesz sposobu na dzielenie i przetwarzanie ciągu w TSQL, jest na to wiele sposobów. W tym artykule omówiono wady i zalety niemal każdej metody:

Tablice i listy w SQL Server 2005 i nowszych

Musisz utworzyć funkcję podziału. Oto jak można użyć funkcji podziału:

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

Wolę podejście oparte na tabeli liczb do dzielenia ciągu w TSQL — przy użyciu Tabela liczb ale istnieje wiele sposobów dzielenia ciągów w SQL Server, zobacz poprzedni link, który wyjaśnia zalety i wady każdego z nich.

Aby metoda tabeli liczb działała, musisz wykonać tę jednorazową konfigurację tabeli, która utworzy tabelę Numbers który zawiera wiersze 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)

Po skonfigurowaniu tabeli liczb utwórz tę funkcję podziału:

CREATE FUNCTION inline_split_me (@SplitOn char(1),@param varchar(7998)) RETURNS TABLE AS
   RETURN(SELECT substring(@SplitOn + @param + ',', Number + 1,
                    charindex(@SplitOn, @SplitOn + @param + @SplitOn, Number + 1) - Number - 1)
                 AS Value
          FROM   Numbers
          WHERE  Number <= len(@SplitOn + @param + @SplitOn) - 1
            AND  substring(@SplitOn + @param + @SplitOn, Number, 1) = @SplitOn)

GO 

Możesz teraz łatwo podzielić ciąg CSV na tabelę i dołączyć do niego:

select * from dbo.inline_split_me(';','1;22;333;4444;;') where LEN(Value)>0

WYJŚCIE:

Value
----------------------
1
22
333
4444

(4 row(s) affected)

aby stworzyć nową tabelę, użyj tego:

--set up tables:
DECLARE @Documents table (DocumentID varchar(500), SomeValue varchar(5))
INSERT @Documents VALUES ('1,2,3,4','AAA')
INSERT @Documents VALUES ('5,6'    ,'BBBB')

DECLARE @NewDocuments table (DocumentID int, SomeValue varchar(5))

--populate NewDocuments
INSERT @NewDocuments
    (DocumentID, SomeValue)
SELECT
    c.value,a.SomeValue
    FROM @Documents    a
        CROSS APPLY dbo.inline_split_me(',',a.DocumentID) c

 --show NewDocuments contents:
select * from @NewDocuments

WYJŚCIE:

DocumentID  SomeValue
----------- ---------
1           AAA
2           AAA
3           AAA
4           AAA
5           BBBB
6           BBBB

(6 row(s) affected)

jeśli nie chcesz tworzyć tabeli liczb i korzystasz z SQL Server 2005 lub nowszego, możesz po prostu użyć tej funkcji podziału (tabela liczb nie jest wymagana):

CREATE FUNCTION inline_split_me (@SplitOn char(1),@String varchar(7998))
RETURNS TABLE AS
RETURN (WITH SplitSting AS
           (SELECT
                LEFT(@String,CHARINDEX(@SplitOn,@String)-1) AS Part
                    ,RIGHT(@String,LEN(@String)-CHARINDEX(@SplitOn,@String)) AS Remainder
                WHERE @String IS NOT NULL AND CHARINDEX(@SplitOn,@String)>0
            UNION ALL
            SELECT
                LEFT(Remainder,CHARINDEX(@SplitOn,Remainder)-1)
                    ,RIGHT(Remainder,LEN(Remainder)-CHARINDEX(@SplitOn,Remainder))
                FROM SplitSting
                WHERE Remainder IS NOT NULL AND CHARINDEX(@SplitOn,Remainder)>0
            UNION ALL
            SELECT
                Remainder,null
                FROM SplitSting
                WHERE Remainder IS NOT NULL AND CHARINDEX(@SplitOn,Remainder)=0
           )
           SELECT Part FROM SplitSting
       )
GO


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SELECT $ (znak dolara)

  2. Uprawnienia usług Reporting Services w usługach SQL Server R2 SSRS

  3. Jak wyświetlić wszystkie domyślne ograniczenia z kolumnami w bazie danych SQL Server — samouczek SQL Server/TSQL — część 92

  4. Jak ORIGINAL_DB_NAME() działa w SQL Server

  5. Warunkowe ORDER BY w zależności od wartości kolumn