【问题标题】:Split BulkColumn into Rows将 BulkColumn 拆分为行
【发布时间】:2019-08-16 12:13:37
【问题描述】:

我目前将以下数据存储在 CSV 文件中:

253056.0015
253056.0016
253056.0010
253056.0011
253056.0012
253056.0013
253056.0014
253056.0007
253056.0008
253056.0009
253056.0006
253056.0005
252914.0028
253056.0001
253056.0002
253056.0003
253056.0004
253058.0001
252914.0026
252914.0027
252914.0023
252914.0024
252914.0025
252914.0015
252914.0016

以上所有数据都在一列中。

当我运行以下查询时:

select
    *
from 
    openrowset(bulk 'C:\Audits.csv', single_clob) as data;

我得到这样的数据:

如何让数据完全按照 CSV 文件中的样子显示?

i.e - 在下面的行中显示它:

我尝试了以下方法,但没有成功...

declare @results varchar(max)

select
@results = BulkColumn
from openrowset(bulk 'C:\Audits.csv',single_clob) as data;

select value from string_split(@results, ' ');

请帮忙。

【问题讨论】:

  • 你有哪个版本? "but did not succeed" 是什么意思?
  • 我没有成功,因为它仍然显示的数据和第一次查询完全一样...
  • Oops 所以你认为的空白并不是真正的空白。
  • 记住源数据是 CSV 格式的,由于某种原因,string_split,仍然没有拆分它...
  • @Birel 你首先不需要STRING_SPLIT。 BULK 允许您指定格式文件,您可以在其中指定自己的字段分隔符

标签: sql-server tsql sql-server-2016


【解决方案1】:

要直接从OPENROWSET 获取列,您需要定义Format File。更简单的替代方法是使用BULK INSERT,例如

IF OBJECT_ID(N'tempdb..#Data', 'U') IS NOT NULL
    DROP TABLE #Data;

CREATE TABLE #Data (Value DECIMAL(10, 4));

BULK INSERT #Data 
FROM 'C:\Audits.csv'
WITH
(
    FIRSTROW = 1,
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
);

SELECT *
FROM #Data;

注意,这仅适用于:

CREATE TABLE #Data (Value DECIMAL(10, 4));
BULK INSERT #Data 
FROM 'C:\Audits.csv';

但我包括了这些选项,因为这些是相当常见的事情,可能需要修改。

【讨论】:

  • 感谢@GarethD,以后一定会使用它
【解决方案2】:

你认为它是一个空白' ' 并不是真正的空白。

你可以使用(SELECT SUBSTRING(@results , 12, 1))作为

select value from string_split(@results, (SELECT SUBSTRING(@results , 12, 1)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2019-09-03
    • 2012-12-18
    相关资源
    最近更新 更多