通过导入数据向导将引号转义的 CSV 导入 SQL Server 到所有 nvarchar 列
Posted
技术标签:
【中文标题】通过导入数据向导将引号转义的 CSV 导入 SQL Server 到所有 nvarchar 列【英文标题】:Importing quote-escaped CSV into SQL Server via Import Data wizard into all nvarchar columns 【发布时间】:2017-05-16 18:15:41 【问题描述】:我有一个这样的 CSV 数据表:
a | b | c | d | f
1: 12 Dave Larry $1234.0 FALSE
2: 324.0 Bob Gray $24.012 TRUE
3: 2000 John Stan $204.0
4: 9000 Stace Jill - FALSE
5: 850.0 Till $30 TRUE
诸如用户的 cmets 之类的字段将包含逗号,因此这些字段通过单引号或双引号进行转义。 Excel 可以很好地打开这些文件,并可用于在导入前清理或操作数据。
从迁移的角度来看,对我来说最简单的事情是先将数据作为 varchars 导入 SQL Server,然后使用 SQL 将数据操作为目标格式。
我确实遇到了以下问题:
1) 尝试导入 CSV 可能会导致问题。 SQL Server Management Studio 的导入需要严格格式化的 CSV,这意味着像 cmets 列或文本中格式化为货币的数字可能会导致导入失败。
2) 将 CSV 保存为 XLS 时,SQL Server Management Studio 似乎仍然在尝试“聪明”地解释数据的方式,无论其格式如何。有时,即使您愿意,也无法将数据转换为 nvarchar 或 varchar,因为导入实用程序已经假定数据是数字的。制表符分隔可能最终无法正常工作,尤其是对于用户 cmets 之类的内容。
将 CSV 导入 SQL Server,使所有列变为 varchar 或 nvarchar 的无错误方法是什么?
【问题讨论】:
【参考方案1】:一种解决方案是使用 Data -> Text to Columns,分隔,然后不选择任何分隔符。但是,Excel 一次只允许您执行这一列。但是,这个 XLS 可以很好地读入 SQL Server,就像所有 nvarchars 一样。
进一步修改此解决方案,您可以创建以下宏,将其保存到 PERSONAL.XLSB 中,以便在以后的所有工作表中都可用。通过将此宏映射到一个组合键,您可以选择一个单元格,然后宏将选择该列,然后为您运行文本到列功能:
Sub ColumnToNVarChar()
'
' ColumnToNVarChar Macro
' Convert a column in Excel to a format that SQL Server Management Studio's import process will interpret as nvarchar.
'
' Keyboard Shortcut: Ctrl+d
'
ActiveCell.EntireColumn.Select
Selection.TextToColumns Destination:=ActiveCell.EntireColumn, DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 2), TrailingMinusNumbers:=True
End Sub
然后将其保存为 XLS 文件,SQL Server Management Studio 的“导入数据”过程会将每一列视为 nvarchar。通常是 nvarchar(255)。
【讨论】:
以上是关于通过导入数据向导将引号转义的 CSV 导入 SQL Server 到所有 nvarchar 列的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 phpmyadmin 向导将 csv 导入 mysql 数据库
通过 sql developer 导入 csv 时,单引号被转换为 2 个单引号