如何将单元格内带逗号的CSV文件正确导入SQL Server
CSV导入SQL Server字段错位问题解决方案
方案1:调整SSMS导入向导配置
- 重新启动SQL Server导入导出向导,数据源选择「平面文件源」,选中目标CSV文件
- 在常规选项卡中找到文本限定符配置项,默认值为空,修改为
"(英文双引号)。标准CSV格式会自动将包含内部逗号的字段用双引号包裹,开启该配置后SQL Server会忽略双引号内部的逗号,不会将其识别为字段分隔符 - 切换到左侧「列」选项卡预览解析结果,确认字段无错位后再执行后续导入操作
方案2:PowerShell预处理大体积CSV
针对无标准文本限定符的CSV文件,可通过PowerShell批量移除时长列的千位逗号,全程不需要加载整个文件到内存,适合处理GB级大文件:
- 假设你的CSV共5列,时长数据位于第3列,可执行以下命令:
Get-Content "C:\你的文件路径\原始数据.csv" | ForEach-Object { $columns = $_.Split(",") # 数组索引从0开始,第3列对应索引为2 if ($columns.Count -eq 6) { # 合并被千位逗号拆分的两部分,移除逗号 $columns[2] = ($columns[2] + $columns[3]).Replace(",","") # 剔除多余的拆分列,重新组合为正确的5列结构 $columns = $columns[0,1,2,4,5] } $columns -join "," } | Out-File "C:\你的文件路径\处理后数据.csv" -Encoding UTF8
- 正式处理前建议先截取10行测试数据验证列位置匹配,避免批量处理出错
方案3:通过BULK INSERT直接导入并转换
如果不想生成额外的预处理文件,可直接通过SQL语句导入并处理千位逗号:
- 先创建临时表,将所有字段设置为NVARCHAR类型避免导入时类型报错
- 先按行导入所有原始数据到临时表,再通过SQL函数处理字段后插入正式表:
-- 批量导入原始行数据到临时表 BULK INSERT #TempRawData FROM 'C:\你的文件路径\原始数据.csv' WITH ( FIELDTERMINATOR = '\n', ROWTERMINATOR = '\n', CODEPAGE = '65001' ) -- 处理字段后插入正式表 INSERT INTO 你的正式表名称 (列1, 列2, 时长列, 列4, 列5) SELECT 列1 = PARSENAME(REPLACE(整行内容, ',', '.'), 5), 列2 = PARSENAME(REPLACE(整行内容, ',', '.'), 4), 时长列 = CAST(REPLACE(PARSENAME(REPLACE(整行内容, ',', '.'), 3), '.', '') AS INT), 列4 = PARSENAME(REPLACE(整行内容, ',', '.'), 2), 列5 = PARSENAME(REPLACE(整行内容, ',', '.'), 1) FROM #TempRawData
内容的提问来源于stack exchange,提问作者Kip Yerdon
相关产品推荐
相关产品推荐

