SSMS导入Excel/CSV至Azure SQL DB时多值列配置问题咨询
SSMS导入Azure SQL DB多值人名列方案
分隔符选型
针对Albert Einstein、Joe DiMaggio这类外文人名的多值场景,直接选用竖线(|)作为多值分隔符,其余常用分隔符全部不适用,原因如下:
- 空格:人名本身名和姓之间就带空格,用空格会把单个人名拆成两个独立值,完全无法使用
- 逗号:带后缀、称谓的人名常包含逗号(比如
Robert Downey, Jr.),会触发误拆分 - 分号:容易和CSV文件默认的字段分隔符冲突,且部分特殊人名注释场景会用到分号
- 换行符:会破坏CSV/Excel的行结构,导入时大概率出现断行、数据错位问题
竖线不会出现在常规人名书写中,和SSMS、CSV的所有默认分隔规则无冲突,拆分准确率可以达到100%,格式化后的多值列示例:Albert Einstein|Joe DiMaggio|Marie Curie
SSMS导入向导配置规则
首先明确:SSMS导入向导没有原生的「多值列标记+自动拆分」功能,根据你的存储需求分两种场景配置:
场景1:多值内容直接存入单字段(后续按需拆分)
这是最简便的方案,操作步骤:
- 导入流程走到「选择源表和源视图」步骤时,点击对应表的「编辑映射」选项
- 找到存储多值人名的目标字段,将数据类型设置为足够长度的
nvarchar类型(建议直接用nvarchar(MAX),避免长内容截断) - 若源文件为CSV格式,在平面文件数据源配置页,将文本限定符设置为双引号(
"),保证被双引号包裹的字段内的竖线不会被识别为全局字段分隔符 - 完成配置后正常执行导入即可,整段多值内容会作为完整字符串写入目标字段。后续需要拆分取值时,直接调用Azure SQL DB内置的
STRING_SPLIT函数即可,示例代码:
SELECT TRIM(value) AS PersonName FROM YourMainTable CROSS APPLY STRING_SPLIT(MultiNameColumn, '|') WHERE TRIM(value) <> ''
场景2:导入时直接拆分多值到关联子表
向导本身不支持导入过程中实时拆分,走两步中转即可:
- 按场景1的操作流程,先把包含多值列的源数据全部导入一张临时中转表,多值列整列存为
nvarchar类型,不做拆分 - 执行一段简单SQL完成拆分插入,把拆分后的单个人名写入关联子表,同时关联主表主键,示例代码:
INSERT INTO dbo.PersonRelatedTable (MainDataID, PersonName) SELECT staging.ID AS MainDataID, TRIM(split.value) AS PersonName FROM dbo.StagingTempTable staging CROSS APPLY STRING_SPLIT(staging.MultiNameColumn, '|') split WHERE TRIM(split.value) <> ''
内容的提问来源于stack exchange,提问作者Bryan Schmiedeler
相关产品推荐
相关产品推荐

