Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

bagaimana cara membagi dan memasukkan data CSV ke tabel baru dalam satu pernyataan?

Anda memerlukan cara untuk memisahkan dan memproses string di TSQL, ada banyak cara untuk melakukannya. Artikel ini membahas PRO dan Kontra dari hampir setiap metode:

Array dan Daftar di SQL Server 2005 dan Selanjutnya

Anda perlu membuat fungsi split. Ini adalah bagaimana fungsi split dapat digunakan:

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

Saya lebih suka pendekatan tabel angka untuk membagi string di TSQL - Menggunakan Daftar Angka tetapi ada banyak cara untuk memisahkan string di SQL Server, lihat tautan sebelumnya, yang menjelaskan PRO dan KONTRA masing-masing.

Agar metode Tabel Angka berfungsi, Anda perlu melakukan pengaturan tabel satu kali ini, yang akan membuat tabel Numbers yang berisi baris dari 1 hingga 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)

Setelah tabel Numbers diatur, buat fungsi split ini:

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 

Sekarang Anda dapat dengan mudah membagi string CSV menjadi tabel dan menggabungkannya:

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

KELUARAN:

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

(4 row(s) affected)

untuk membuatkan Anda tabel baru gunakan ini:

--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

KELUARAN:

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

(6 row(s) affected)

jika Anda tidak ingin membuat tabel Numbers dan menjalankan SQL Server 2005 dan yang lebih baru, Anda bisa menggunakan fungsi split ini (tidak perlu tabel Numbers):

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. Menambahkan identitas ke kolom yang ada

  2. database terlampir hanya baca

  3. Jalankan SERVERPROPERTY() Terhadap Server Tertaut di SQL Server

  4. Masukkan 2 juta baris ke SQL Server dengan cepat

  5. Bagaimana saya bisa mengulang semua file dalam folder menggunakan TSQL?