我有一个由另一个进程创建的CSV文件(我无法更改),该文件在数据下方的一行中包含时间戳和用户名。我需要在没有最后一行的情况下导入数据,因为这会导致错误,因为它是无效的列值。
如果我手动删除此行(我想避免这样做),那么我的SQL可以使用以下命令成功导入数据:
BULK INSERT #TempReport
FROM 'D:\ac2000\Reg.csv'
WITH
(
FORMAT = 'CSV',
FIRSTROW = 2, -- second row so skip header row in csv file
FIELDTERMINATOR = ',', --CSV field delimiter
FIELDQUOTE = '"', -- Double quote mark is a text delimiter
ROWTERMINATOR = '\n'
)
我知道批量插入中也有一个LASTROW选项,但是CVS每次都有不同的行数,因此我需要一种无需导入即可计算行数的方法! ...或者至少不使用上述方法导入它,只会导致另一个错误。
答案 0 :(得分:1)
您可以阅读该csv文件而不导入它。
SELECT *
FROM OPENROWSET (
BULK N'd:\temp\data.csv',
FORMATFILE = 'D:\temp\fmt.fmt',
FIRSTROW=2
) j
data.csv
ID, User
1,User1
10,User 10
11,User 11
2,user2
格式化文件
13.0
2
1 SQLCHAR 0 2 "," 1 PersonID ""
2 SQLCHAR 0 25 "\r\n" 2 FirstName SQL_Latin1_General_CP1_CI_AS
您可以使用.fmt
或.xml
并使用bcp
生成它。
您可以通过以下链接阅读有关格式文件以及如何生成格式文件的更多信息。
NON xml format file
XML format file
Generate format file
这里是有关OPENROWSET
的文档