Ряды CSV в SQL в таблицу столбцов - PullRequest
0 голосов
/ 16 января 2012

Допустим, у меня есть таблица с 3 строками - каждая строка содержит CSV, и я могу гарантировать, что когда-либо будет только 1 запятая

xxx,111
yyy,222
zzz,333

Как я могу выбрать таблицу так, чтобы в результатеТаблица имеет 2 столбца:

xxx    111
yyy    222
zzz    333

Я пробовал SELECT split(item,',') FROM A

Но, очевидно, это не сработает.Есть ли функциональный способ сделать это без использования курсоров?

Я использую SQL Server 2008

Ответы [ 3 ]

3 голосов
/ 16 января 2012

Нет такого простого функционального способа, как split ().Есть способ без использования курсоров:

SELECT
SUBSTRING(item, 1,
        CHARINDEX(',', item) - 1
    ) AS Field1,
SUBSTRING(item, CHARINDEX(',', item) + 1,
        LEN(item) - CHARINDEX(',', item)
    ) AS Field2
FROM A
1 голос
/ 17 января 2012

Я использую эту хранимую процедуру для загрузки файлов .csv в существующие таблицы, она может вам помочь. Он загрузит все CSV-файлы в папке, соответствующей шаблону, в таблицу. Вы должны передать это

  • имя папки, в которой находятся ваши файлы .csv (например, c: \ temp),
  • шаблон имени файла (* _daily_export.csv),
  • имя таблицы, в которую вы хотите загрузить файлы (например, MyTable)
  • флаг, указывающий, хотите ли вы переключать обработанные файлы в подпапку «done» папки (1)
  • символ-разделитель (, или;)
  • первая строка данных (2, если у вас есть заголовки)
  • формат файла (см. http://msdn.microsoft.com/en-us/library/ms178129.aspx)

Он не на 100% надежен (например, избегайте слишком длинных имен файлов или пробелов в них), но вы можете изменить его по своему усмотрению.

-- ============================================================
-- Author:      László Tenki
-- Create date: 2011-06-20
-- Description: Data integration script for loading Excel files
--              using the standard MS data connectivity pack
--              Microsoft.ACE.OLEDB.12.0
-- ============================================================
ALTER procedure [di].[genericCSVImporter]
    -- parameters for the stored procedure
    @folder varchar(500), @fileNamePattern varchar(100), 
    @table varchar(128), @moveProcessed bit, 
    @fieldDelimiter varchar(1), @firstRow int, @formatFile nvarchar(25)
as
begin
    declare @query varchar(1000)
    declare @filename varchar(200)
    declare @formatFilePath varchar(200)

    declare @dir table ([name] varchar(200))
    set @query ='master.dbo.xp_cmdshell "dir ' + @folder + '\' + @fileNamePattern + ' /b"'
    set @query = replace(@query, '\\', '\')
    insert into @dir exec (@query)
    delete from @dir where name is NULL

    declare myc cursor for select [name] from @dir where [name]<> 'File Not Found' order by [name]
    open    myc 
    fetch next from myc into @filename

    while @@fetch_status = 0
        begin
        set @filename = @folder + '\' + @filename
        set @filename = replace(@filename, '\\', '\')
        set @formatFilePath = replace(@folder + '\' + @formatFile, '\\', '\')

        set @query ='BULK INSERT ' + @table + ' FROM ''' + @filename + 
            ''' WITH (FIELDTERMINATOR = ''' + @fieldDelimiter + ''', ROWTERMINATOR = ''\n'', ' + 
            'FIRSTROW = ' + cast(@firstRow as nvarchar(10)) + ', CODEPAGE = ''ACP'', ' + 
            'FORMATFILE=''' + @formatFilePath + ''')'
        print @query
        exec (@query)

        if @moveProcessed=1 
            begin
            set @query = 'master.dbo.xp_cmdshell "copy /Y ' + @filename + ' ' + @folder +'\done"'
            exec (@query)
            set @query = 'master.dbo.xp_cmdshell "del /Q ' + @filename + '"'
            exec (@query)
            end

        fetch next from myc into @filename
        end 

    close myc
    deallocate myc
end
1 голос
/ 16 января 2012

Посмотрите на этот пост Функция Split в Sql Server для разбиения разделенных запятыми строк в таблицу . Я думаю, что это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...