【问题标题】:INSERTing rows from a SELECT statement into a sequence of columns将 SELECT 语句中的行插入到列序列中
【发布时间】:2013-11-16 08:51:28
【问题描述】:

这可能是一个菜鸟问题,但是有没有一种简单的方法可以将 select 语句中的 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]

有什么简单的方法可以做到这一点吗?

【问题讨论】:

  • 你在使用 SQL Server 数据库吗?
  • usr,感谢您的斯巴达式回复。它至少为我指明了正确的方向
  • 最后一次执行拆分函数以在单列中为我们提供结果,但 INSERT 语句使用三列。你能澄清一下这一步吗?
  • 谢谢亚历山大,我解决了这个问题。当然,在每种情况下都应该是 col2

标签: sql-server tsql select insert split


【解决方案1】:

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

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

第一次拆分后,您有一个表格格式的数据。因此,您可以使用 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上的演示

【讨论】:

  • 嗨,亚历山大。我不能这样做。我的数据不是来自 CSV 文件。
  • "我有一个函数可以将一些 CSV 拆分成行。"头脑 == 被吹走了。
  • 我应该解释一下逗号分隔值不存储在 .csv 文件中。它们来自另一个来源。没关系——毕竟我决定走可变路线。
  • @roryok 答案已更新,请重试
  • 谢谢亚历山大。我决定使用静态变量,因为我的结构没有改变,但这确实回答了最初的问题,所以我会接受它
猜你喜欢
  • 2016-09-01
  • 2021-01-17
  • 2011-10-30
  • 2022-11-20
  • 2016-10-18
  • 1970-01-01
  • 2022-12-25
  • 1970-01-01
相关资源
最近更新 更多