如何在 SSMS (SQL) 上导入带有 TIME 列的 CSV

何塞古铁雷斯

我有一个具有以下格式的 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在SSMS中针对SQL Azure运行多个SQL脚本?

像SSMS一样,如何在T-SQL中将TIMESTAMP值转换为VARCHAR?

如何在Oracle Apex上上传没有列映射的text / csv文件数据?

通过SSMS将平面文件导入SQL Server失败

如何在KDB中导入带有大标题的CSV?

从SSMS中的查询结果创建带有SQL的表

导入CSV后如何修改列标题?

使用熊猫在csv导入上删除没有标题的列

如何在SQL表中返回带有列条件的前一行值?

如何在带有附加条件(例如列数检查和分组)的SQL上使用PIVOT?

如何导入带有空白单元格的csv

尝试通过代理使用SSMS访问Cloud SQL上的SQL Server实例时如何修复connectex错误

如何在没有任何查询的情况下更改SQL上的SSMS警告设置?

如何导入带有或不带有标题的csv,并允许记录具有空列字段?

如何将CSV导入SQL并将文件名插入最后一列?

如何在另一个表ssms中更新具有相同值的列?

如何在ruby中修改现有的csv列?

如何导入带有复杂字段的csv

Python - 如何在csv中获取带有开始和结束时间列的“持续时间”列?

如何从 SSMS 2016 (Microsoft SQL Server) 注销?

如何在 PL/SQL 中将 CSV 字符串转换为多列结果?

如何在联合列 SQL 上使用 MIN

CSV 上的 SSIS SSMS 逗号问题

将带有 postgres 几何列的 CSV 导入为 SF

如何在 Python3 中导入带有推文 ID 的 CSV/JSON 文件?

如何在SSMS中查看执行的SQL

如何在 SQL 中将带有空格的值拆分为两列?

SSMS SQL - 创建具有相关列的表

如何将带有最后一个空列的 CSV 导入 R?