【发布时间】:2019-10-05 15:37:48
【问题描述】:
我有一个由另一个进程(我无法更改)创建的 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'
)
我知道 Bulk Insert 中还有一个 LASTROW 选项,但是 CVS 每次都会有不同的行数,所以我需要一种计算行数的方法,而不需要导入它! ...或者至少,不使用上述方法导入它,只会导致另一个错误。
【问题讨论】:
-
为什么不直接导入所有行并从临时表中删除最后 3 行?
-
@PeterHe 就是这样 - 由于最后一行中的时间戳,导入将首先不起作用,这会导致错误,因为它是无效的列值。
-
我通常将整个文件导入一个带有“行号”列(
identity)和varchar(8000)的表中,然后从那里清理它 - 删除最后一行,拆分字段。
标签: sql sql-server