将文本文件导入SSMS时如何避免Datetime字段被拆分为两列
问题根因
该问题基本都是平面文件的分隔符配置错误导致:如果你的datetime字段是「日期 时间」的空格分隔格式,而你在导入向导中误将空格设为了列分隔符,或者没有配置正确的文本限定符,就会导致单个datetime字段被拆分为日期、时间两列。
可行的非手动解决方案
方法1:直接修改SSMS导入向导配置(最便捷)
- 打开导入向导走到「选择平面文件源」步骤,在左侧导航栏进入「列」选项卡
- 先确认行分隔符匹配文件实际的换行规则(通常为
{CR}{LF}),再把列分隔符修改为文件实际的字段分隔规则(比如逗号、制表符,不要选择空格作为分隔符) - 切换到「高级」选项卡,找到被误拆分出来的两个临时列,删掉多余的列,将保留的对应列的数据类型设置为
DT_DBTIMESTAMP,同时调整该列的列宽到足够容纳完整的datetime字符串 - 后续步骤正常执行即可,100万行数据导入不会有性能问题
方法2:保存为SSIS包处理(适合重复导入同格式文件场景)
- 在导入向导的最后一步,选择「保存SSIS包」选项,将本次的配置保存为dtsx格式包文件
- 打开SSIS包编辑界面,调整平面文件源组件的分隔符规则,如果你的datetime字段是被双引号/单引号包裹的,直接配置对应文本限定符即可自动识别为单个字段
- 配置完成后直接执行包即可,也可以后续定时/批量调用导入同格式的文件
方法3:用BULK INSERT命令导入(适合熟悉SQL操作的场景)
直接在SSMS查询窗口执行批量插入命令,显式指定分隔符和字段规则,示例代码如下:
BULK INSERT 你的目标表名 FROM 'C:\你的文件存储路径\源文件.txt' WITH ( FIELDTERMINATOR = ',', -- 替换为你实际的列分隔符 ROWTERMINATOR = '\n', -- 替换为你实际的行分隔符 CODEPAGE = '65001', -- UTF-8编码文件填65001,GBK编码填936 FIRSTROW = 2, -- 首行是表头则设为2,无表头则设为1 TABLOCK )
如果datetime格式和SQL Server默认格式不匹配,可以先将该字段导入为VARCHAR(50)类型,再执行转换语句即可,示例如下:
-- 格式为yyyy-MM-dd HH:mm:ss时用格式码120,其他格式替换为对应格式码即可 UPDATE 你的目标表名 SET 目标datetime列 = CONVERT(DATETIME, 临时存储的varchar列, 120); -- 转换完成后修改字段类型 ALTER TABLE 你的目标表名 ALTER COLUMN 目标datetime列 DATETIME;
内容的提问来源于stack exchange,提问作者oilers128
相关产品推荐
相关产品推荐

