如何将含GUID列的CSV文件导入SQL Server的uniqueidentifier类型列
解决SSMS导入CSV中GUID到uniqueidentifier列的可行方案
你遇到的Invalid cast from 'System.String' to 'System.Guid' (mscorlib)报错是SSMS导入向导的隐式类型转换逻辑问题,.NET层面的强转无法兼容CSV中带大括号的GUID字符串格式,可通过以下三种方案解决:
方案1:临时中转字符串类型后转换(操作最简单)
- 导入向导走到「指定表复制或查询」步骤后,进入「列映射」配置页
- 将目标表中存储GUID的列类型暂时设置为
NVARCHAR(38)(适配带大括号的GUID最大长度),完成数据导入 - 导入完成后先执行校验查询,确认所有数据都符合GUID格式:
-- 检查是否存在无法转换为GUID的异常数据,无返回结果则表示全部合规 SELECT AccountGuid FROM 你的目标表名 WHERE TRY_CAST(AccountGuid AS UNIQUEIDENTIFIER) IS NULL
- 确认无异常后执行语句修改列类型即可:
ALTER TABLE 你的目标表名 ALTER COLUMN AccountGuid UNIQUEIDENTIFIER;
方案2:调整平面文件源的列属性(无需后续修改表结构)
- 导入向导第一步选择「平面文件源」并选中目标CSV后,进入「高级」配置页
- 找到存储GUID的列,将其数据类型设置为
DT_WSTR,输出列宽设置为38 - 后续映射时直接关联目标表的
UNIQUEIDENTIFIER类型列即可,向导会自动完成合法转换,不会触发类型报错
方案3:用SQL命令直接导入(适合批量导入场景)
跳过SSMS图形化向导的隐式转换逻辑,直接用BULK INSERT或OPENROWSET导入,在SQL层面完成类型转换,示例:
BULK INSERT 你的目标表名 FROM 'C:\本地CSV文件的完整路径\文件名.csv' WITH ( FORMAT = 'CSV', FIRSTROW = 2, -- 跳过首行表头 FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' )
注意:如果导入后日期格式异常,可在导入后单独执行日期字段的格式转换,或在OPENROWSET中自定义字段转换规则
内容的提问来源于stack exchange,提问作者Cale Sweeney
相关产品推荐
相关产品推荐

