2013-12-17 2 views
0

У меня есть таблица, где столбец выглядит следующим образом:синтаксического анализа через запятую колонки, чтобы вставить в таблицу

Column 0 
2013-11-27 13:11:00,1XRTT,DATA,East Michigan,Region 2,East Michigan_PORT HURON_CL#17,LNS1,2436,DE60XC049,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,,,,,,,,,,,76,0,0,0,0,0,0,0,41,35,0,2.59444444444444444444444444444444444444,0,76,0,0,0,168,168,,,,,,,,,,,,,,,,,,,,,,,,,155.666666666666666666666666666666666667,0,0,0,0,0,3,0,104,0,0,0,150,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0 

я хотел бы, чтобы разобрать его в другую таблицу со столбцами для каждого из разделителей. У меня уже создана таблица вставки, но как ее разобрать в новую таблицу?

на основе комментарий от Mate, я сделал это

создал такую ​​функцию:

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SplitString_Using_CTE_Charindex]') 
AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) 
    DROP FUNCTION [dbo].[SplitString_Using_CTE_Charindex] 
GO 

CREATE FUNCTION SplitString_Using_CTE_Charindex (@csv_str VARCHAR(8000),@delimiter varchar(20)) 
RETURNS @splittable TABLE (id int identity(1,1), csvvalues VARCHAR(8000)) 
AS 
BEGIN 

-- Check for NULL string or empty sting 
    IF (LEN(@csv_str) < 1 OR @csv_str IS NULL) 
    BEGIN 
     RETURN 
    END 

    ; WITH csvtbl(i,j) 
    AS 
    (
     SELECT i=1, j= CHARINDEX(@delimiter,@[email protected]) 

     UNION ALL 

     SELECT i=j+1, j=CHARINDEX(@delimiter,@[email protected],j+1) 
     FROM csvtbl 
     WHERE CHARINDEX(@delimiter,@[email protected],j+1) <> 0 
    ) 

    INSERT INTO @splittable (csvvalues) 
    SELECT SUBSTRING(@csv_str,i,j-i) 
    FROM csvtbl 

    RETURN 
END 

GO 

затем выбежала это:

DECLARE @csv_str VARCHAR(8000) 
     ,@delimiter VARCHAR(20) 
SET @csv_str = (select * from testimport); 

SET @delimiter =',' 

SELECT * FROM dbo.SplitString_Using_Charindex(@csv_str,@delimiter) 

, но потом я получил это:

Msg 512, Level 16, State 1, Line 3 
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

I di d a верхняя часть 1 в запросе тоже, но получила это:

Msg 530, Level 16, State 1, Line 43 
The statement terminated. The maximum recursion 100 has been exhausted before statement completion. 
+0

Проверить http://prosqlserver.com/blog/2011/02/05/parsing-csv-or-other-delimited-strings-in-sql-server/. Вы могли бы SELECT INTO с результатом функции – Mate

+0

обновили вопрос Mate на основе вашего предложения ... Спасибо! – user2061886

+2

Я думаю, что «выберите * из testimport» возвращает более одного результата. Вам нужен курсор или что-то, чтобы повторять результаты и вызывать функцию для каждого результата ... Попробуйте с помощью «select top 1 * from testimport», а если работает ... перейдите на курсор – Mate

ответ

0

Две вещи неправы. Во-первых, если вы собираетесь назначать результаты запроса переменной varchar, вам нужно гарантировать, что запрос будет возвращать только одно значение, которое является varchar или может быть неявно преобразовано. Прямо сейчас вы говорите: «Возьмите этот набор результатов, который, вероятно, будет состоять из нескольких строк и наполнит его одной строкой». Вы должны добавить первый запрос к запросу, но это не долгосрочное решение, это просто проверка. В конце концов вам нужно будет либо выполнить этот процесс, используя курсор для повторения результатов, либо перепроектировать функцию, чтобы принять таблицу результатов в качестве входных данных. Позднее было бы лучше всего, особенно если вы хотите, чтобы это масштабировалось вообще.

Вторая проблема заключается в том, что вы не можете рассматривать функцию как таблицу для выбора. Вот почему он дает вам вторую ошибку. Это похоже на то, что вы пытаетесь выбрать * из count (*), что на самом деле не имеет смысла. Я хотел бы предложить изменения этого к хранимой процедуре, чтобы вы могли создать таблицу результатов и вставить в него, вызвав что-то вроде ехеса SplitString_Using_Charindex @csv_str, @delimiter

0

Если у вас есть доступ к файловой системе, вы можете использовать инструмент в SQL Server BCP чтобы выгрузить данные в плоский файл, а затем прочитать их как разделенные запятыми. Как вы, вероятно, выяснили, SQL не является отличным инструментом для синтаксического анализа текста.

bcp MySourceTable out C:\tabledump.txt -c -T 


BULK INSERT MyDestinationTable 
FROM 'C:\tabledump.txt' 
WITH (
    DATAFILETYPE='char', 
    FIELDTERMINATOR=',' 
); 
Смежные вопросы