Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

как да разделя и вмъквам CSV данни в нова таблица в едно изявление?

Имате нужда от начин да разделите и обработите низа в TSQL, има много начини да направите това. Тази статия обхваща плюсовете и минусите на почти всеки метод:

Масиви и списъци в SQL Server 2005 и след това

Трябва да създадете функция за разделяне. Ето как може да се използва функция за разделяне:

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

Предпочитам подхода на числовата таблица за разделяне на низ в TSQL - Използване на Таблица с числа но има много начини за разделяне на низове в SQL Server, вижте предишната връзка, която обяснява плюсовете и минусите на всеки.

За да работи методът Numbers Table, трябва да направите тази еднократна настройка на таблицата, която ще създаде таблица Numbers който съдържа редове от 1 до 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)

След като таблицата с числа е настроена, създайте тази функция за разделяне:

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 

Вече можете лесно да разделите CSV низ в таблица и да се присъедините към нея:

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

ИЗХОД:

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

(4 row(s) affected)

за да създадете нова таблица, използвайте това:

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

ИЗХОД:

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

(6 row(s) affected)

ако не искате да създадете таблица Numbers и използвате SQL Server 2005 и по-нова версия, можете просто да използвате тази функция за разделяне (не се изисква таблица 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. Как се стига до ограничения от 8060 байта на ред и 8000 на (varchar, nvarchar) стойност?

  2. Изпращане на имейли с прикачени файлове в SQL Server (T-SQL)

  3. SQL SELECT ЧЧ:ММ - ЧЧ:ММ

  4. Връщане на списък със сървърни тригерни събития в SQL Server

  5. Пример за вмъкване на SQL Server