如何解决CSV导入MSSQL时的string[DT_STR]错误及日期转换问题
解决SSMS导入CSV时的DT_STR及日期列转换失败问题
核心排查与解决步骤
检查CSV文件的实际内容
直接用记事本/VS Code打开CSV文件,重点核查create_dt列:- 确认所有行的日期格式统一(比如是否存在
yyyy-MM-dd和MM/dd/yyyy混合的情况) - 排查是否有空值、特殊字符(如空格、不可见字符)或非日期内容(如
N/A、空字符串) - 验证列分隔符是否正确,是否有字段因包含分隔符未用引号包裹,导致列错位(比如某字段含逗号,使得
create_dt被错误解析到其他列)
- 确认所有行的日期格式统一(比如是否存在
调整Flat File连接管理器配置
- 在导入向导的「Flat File源」步骤,点击「高级」按钮
- 找到
create_dt列,将默认的string[DT_STR]数据类型改为date[DT_DATE]或datetime[DT_DBTIMESTAMP],同时确认列宽足够容纳日期字符串 - 若日期格式非标准,切换到「常规」选项卡,选择匹配的区域设置(如中文简体),并勾选「保留 null 值」
手动配置SSIS转换组件
若向导自动转换失效,建议手动搭建SSIS包:- 添加「数据转换」组件,连接Flat File源与目标表
- 选择
create_dt列,设置转换类型为DT_DBTIMESTAMP,并指定对应日期格式(如yyyy-MM-dd HH:mm:ss) - 若存在格式不统一的日期,添加「派生列」组件处理异常值:
ISDATE(create_dt) ? (DT_DBTIMESTAMP)create_dt : NULL(DT_DBTIMESTAMP)
验证目标表列定义
确认MSSQL中employee_account表的create_dt列类型:- 若目标列是
DATE类型,CSV日期必须是无时间部分的yyyy-MM-dd格式 - 若目标列是
DATETIME/DATETIME2,需确保CSV日期包含合法时间部分,或支持隐式转换
- 若目标列是
改用BULK INSERT命令导入
若向导始终报错,直接用T-SQL命令更灵活控制格式:BULK INSERT employee_account FROM 'C:\path\to\your\employee_account.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', FIRSTROW = 2, -- 若CSV包含表头则跳过第一行 DATEFORMAT = 'ymd', -- 匹配CSV的日期格式,如dmy/mdy KEEPNULLS )
常见避坑点
- 编码问题:若CSV是UTF-8带BOM编码,需在Flat File连接管理器中设置对应编码,避免乱码导致转换失败
- 列数匹配:确认CSV表头列数与目标表列数完全一致,防止列错位引发错误
内容的提问来源于stack exchange,提问作者Bami
相关产品推荐
相关产品推荐

