将SELECT语句中的行插入到一系列列中

时间:2013-11-05 13:06:10

标签: sql-server tsql select insert split

这可能是一个noob问题,但是有一个很简单的方法可以将ROWS从选择状态插入另一个表的COLUMNS吗?

我不只是在谈论做INSERT / SELECT

我有一个将一些CSV分成行的功能。所以说我有两行数据,比如这个

joe,bloggs,joe.bloggs@domain.fake;jane,soap,jane.soap@domain.notreal;

我先用分号分开,然后用逗号分隔

第一次分组呼叫的结果

Id Data
1  joe,bloggs,joe.bloggs@domain.fake
2  jane,soap,jane.soap@domain.notreal

其中每一个我再次运行拆分功能

Id Data
1  Joe 
2  Bloggs
3  joe.bloggs@domain.fake

使用这个返回的数据,我想做一个看起来像这样的插入语句

INSERT INTO Customers (@first,@last,@email) 
SELECT [row1].[col2],[row2].[col2],[row3].[col2]

有没有简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

将CSV中的所有数据加载到数据库表的简单方法是使用BULK INSERT语句。您需要做的就是使用正确的参数(在您的情况下,FIELDTERMINATOR =',',ROWTERMINATOR =';')

BULK INSERT Customers
FROM 'c:\split.csv'
WITH
(FIELDTERMINATOR = ',',
 ROWTERMINATOR = ';'
 )
GO

第一次拆分后,您将获得表格格式的数据。因此,您可以使用greate方法将带有分隔字符串的列拆分为多个列,使用XML方法

INSERT dbo.Customers([first], [last], [email])
SELECT Split.a.value('/M[1]', 'VARCHAR(100)' ) AS [first],
       Split.a.value('/M[2]', 'VARCHAR(100)' ) AS [last],
       Split.a.value('/M[3]', 'VARCHAR(100)' ) AS [email]
FROM (SELECT CAST('<M>' + REPLACE(Data , ',' , '</M><M>' ) + '</M>' AS XML) AS xmlData
      FROM dbo.testCSV
      ) AS x CROSS APPLY XMLDATA.nodes('.') AS Split(a)

SQLFiddle上的演示

相关问题