2012-01-16 67 views
0
的表

比方說,我有一個表3行 - 每行包含一個CSV,我可以保證會有永遠只能是1個逗號排在SQL CSV中的成列

xxx,111 
yyy,222 
zzz,333 

我怎麼能選擇表,使結果表中都有2列如下:

xxx 111 
yyy 222 
zzz 333 

我已經試過SELECT split(item,',') FROM A

但很明顯,這是不行的。 是否有一種不使用遊標的功能方式?

我正在使用SQL Server 2008

回答

3

有沒有簡單的功能方式,如split()雖然。有沒有使用遊標的方法:

SELECT 
SUBSTRING(item, 1, 
     CHARINDEX(',', item) - 1 
    ) AS Field1, 
SUBSTRING(item, CHARINDEX(',', item) + 1, 
     LEN(item) - CHARINDEX(',', item) 
    ) AS Field2 
FROM A 
+1

在上面的查詢中,第一列(Field1)將附加一個逗號。 Plz將第一部分替換爲SUBSTRING(item,1,CHARINDEX(',',item)-1)AS Field1。 – 2012-01-16 09:24:52

+0

感謝敏銳的目光Kumar – cctan 2012-01-16 09:31:42

1

看看這個帖子Split Function in Sql Server to break Comma-Separated Strings into Table。我認爲這會解決你的問題。

+0

這是一個不同的問題。 OP已經有了一個單列的表格,並且希望將它變成一個有兩列的表格(每個值被分成兩個)。你鏈接到的帖子是關於將一​​個* single *值分成一個* column *的值,這也不是一個不常見的問題,只是它完全不同。 – 2012-01-16 12:48:03

1

我正在使用此存儲過程將.csv文件加載到現有表中,它可能會對您有所幫助。它會將與模式匹配的文件夾中的所有csv文件加載到表中。你必須通過它

  • 您在您的.csv文件的文件夾的名稱(如C:\ TEMP),
  • 一個文件名模式(* _daily_export.csv)
  • 的表的名稱要的文件加載到(如MyTable的)
  • 一個標誌,指示是否要模式處理的文件到文件夾的「完成」的子文件夾(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