我有一个具有以下格式的 CSV
COL1 | COL2
20211002 | 163136
(YYYYMMDD) | (HHMMSS)
在 SQL 上,我正在创建一个具有以下格式的表
CREATE TABLE dbo.[table] (
[COL1] DATE,
[COL2] TIME,
);
大货:
BULK INSERT dbo.[table]
FROM 'path\df_2.csv'
WITH (FIRSTROW=2, MAXERRORS=0, FIELDTERMINATOR=',' , ROWTERMINATOR='\n');
COL1 工作正常并且正在读取,但是 COL02 给我带来了麻烦并给了我以下错误
Msg 4864, Level 16, State 1, Line 17
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 2, column 13 (COL2).
我该如何解决这个问题?
问题是你的COL2
数据不符合 .t-sqlTIME
格式hh:mm:ss
。如果您无法重做源文件以将该列转换为正确的格式,您可以在加载期间使用 转换数据OPENROWSET
,而不是使用BULK LOAD
.
首先创建一个这样的格式文件(将其命名为 fmt.xml 或其他名称):
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR=","/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\n"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="COL1" xsi:type="SQLDATE"/>
<COLUMN SOURCE="2" NAME="COL2" xsi:type="SQLVARYCHAR"/>
</ROW>
</BCPFORMAT>
然后使用它来批量加载您的数据:
INSERT dbo.[table] (COL1, COL2)
SELECT
COL1,
CONCAT(LEFT(COL2,2), ':', SUBSTRING(COL2, 3, 2),':', SUBSTRING(COL2, 5, 2)) COL2
FROM OPENROWSET
(
BULK 'path\df_2.csv',
CODEPAGE = 'RAW',
FIRSTROW = 2,
FORMATFILE = 'path\fmt.xml' --the path to your format file from above
) AS csv;
这里的技巧是在批量加载期间OPENROWSET
将您的数据读取COL2
到内存中VARCHAR
,如格式文件中指定的那样。然后,您可以使用普通的 t-sql 对其进行操作,将其转换为兼容格式,以便TIME
将内存中的数据插入表中。
假设您的COL2
数据在所有应该为您做的情况下都是 6 个字符。如果您的数据在某些地方不是 6 个字符,您需要在SELECT
;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句