Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

làm thế nào để tách và chèn dữ liệu CSV vào một bảng mới trong một câu lệnh?

Bạn cần một cách để tách và xử lý chuỗi trong TSQL, có nhiều cách để thực hiện việc này. Bài viết này đề cập đến những CHUYÊN GIA và CON của hầu hết mọi phương pháp:

Mảng và danh sách trong SQL Server 2005 và hơn thế nữa

Bạn cần tạo một hàm chia nhỏ. Đây là cách một hàm phân tách có thể được sử dụng:

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

Tôi thích cách tiếp cận bảng số để tách một chuỗi trong TSQL - Sử dụng Bảng số nhưng có nhiều cách để tách chuỗi trong SQL Server, hãy xem liên kết trước, giải thích các CHUYÊN GIA và CON của mỗi cách.

Để phương pháp Bảng số hoạt động, bạn cần thực hiện thiết lập bảng một lần này, thao tác này sẽ tạo một bảng Numbers chứa các hàng từ 1 đến 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)

Khi bảng Numbers được thiết lập, hãy tạo hàm tách này:

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 

Giờ đây, bạn có thể dễ dàng chia một chuỗi CSV thành một bảng và tham gia vào đó:

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

ĐẦU RA:

Giá trị
Value
----------------------
1
22
333
4444

(4 row(s) affected)

để tạo cho bạn bảng mới, hãy sử dụng cái này:

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

ĐẦU RA:

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

(6 row(s) affected)

nếu bạn không muốn tạo bảng Numbers và đang chạy SQL Server 2005 trở lên, bạn chỉ có thể sử dụng hàm tách này (không yêu cầu bảng 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. Dù sao để tạo một trình kích hoạt DDL SQL Server cho các câu lệnh SELECT?

  2. Hiệu suất tổng hợp có điều kiện

  3. Không thể chuyển các tham số đầu vào cho thủ tục được lưu trữ

  4. Cài đặt cụm chuyển đổi dự phòng SQL Server -4

  5. Không thể kết nối với AWS EC2 từ studio trực quan (hoặc thực tế ở bất kỳ đâu)