hoj*_*oju 5 sql-server linux import mac-os-x csv
我需要以可以导入 Microsoft SQL Server 数据库的格式提供数据;但是,我没有 Windows 或无法访问 SQL Server 实例。
数据目前位于多个 CSV 电子表格中。我查看了BULK INSERT但发现他们对 CSV 的支持非常有限,例如无法识别双引号(文档:指定字段和行终止符)。我读过不支持边缘情况,例如字段恰好包含引号(因此需要转义)。
是否有更可靠的中间格式可以从 Linux/OSX 生成?例如 MySQL 转储、Excel、Sqlite、XML 等?
我还需要这个导入过程来创建表而不需要编码。导入的人是非技术人员。这将是一个一次性的过程。
我将无法测试导入,因为我无法直接访问 SQL Server 数据库,因此我正在寻找更可靠的方法。例如 MySQL 转储、XLS、XML 等。
这个请求有一些问题:
目标系统是什么版本的SQL Server?
导入了多少数据?10k、10 Mb 还是更多?
有多少个 CSV 文件?
您已经声明需要处理双引号,这意味着文本限定字段和嵌入的文本限定符。还会有嵌入的字段分隔符(即,)吗?这些通常不是问题,但是否还会有嵌入的行分隔符(即\r\n或只是\n)?这些是大多数 CSV 解析器的最大问题。
在对 Scott 的回答的评论中,您提出了一个问题:“双引号就是一个例子,如果缺少这样的基本功能,我预计还会有其他缺点 - unicode、大小限制等。 ”。您能否更新问题以包括这些和任何其他缺失的要求?
在对该问题的评论中,您会问,关于 SSMS:“这将创建所需的表还是必须预定义? ”。创建表是此导入过程的要求吗?如果是这样,或者即使创建表是一个可选的好处,能否在问题中明确说明?
如果这些表尚不存在,那么关于外键、索引、默认约束、检查约束等需要做什么?
SQL Server 表正在使用什么排序规则,或者至少需要什么排序规则?是否计划简单地继承您要导入的数据库的当前默认排序规则?并且要清楚术语“整理”,因为根据您使用的系统,它的含义可能略有不同,我说的是:区域设置/LCID/文化/代码页(如果适用)。了解源是否对大小写、重音等敏感或不敏感,或者是否正在使用二进制排序规则,这也将有所帮助。
是否有更可靠的中间格式可以从 Linux/OSX 生成?例如 MySQL 转储、Excel、Sqlite、XML 等?
唯一真正可靠的格式是SQL Server生成的格式。XML 通常非常可靠地传输数据(这就是 XML 的用途),并且不存在分隔文件中固有的解析问题(即嵌入的文本限定符和分隔符)。但是,您仍然需要创建表,并且需要编写并测试将 XML 解析为结果集,以便将其插入表中。但是,(在下一个项目中继续)...
你在对斯科特回答的评论中说:
问题是我无法测试导入,因为我无法直接访问 MS SQL 数据库,因此我正在寻找更可靠的方法。
“可靠性”只能通过测试来确定。应该怎么做都无所谓有效,任何事情都可能出错。例如,许多人不知道 XML 具有 UTF-8 编码是很常见的,但 SQL Server 仅处理 XML 甚至 NVARCHAR 数据的 UTF-16(小端)。看看这些数据是如何来自“Linux/OSX”的,我希望默认编码是 UTF-8。
编码问题和其他细微差别都应该(好吧,“大部分”)在测试中暴露出来,但您无法进行测试。因此,关于可靠的导入机制,很难得到非常可靠的答案。
数据的来源是什么?我假设它是问题中提到的 Linux 或 OSX。但它是否专门来自 MySQL(因为还提到了“MySQL 转储”)?了解源是 MySQL 或 PostgreSQL 还是平面文件等将有助于确定哪些工具可用且最适合此请求。
但是,无论来源如何,请记住目标(即 Windows / SQL Server)处理 UTF-16(Little Endian)编码数据最“舒适”。因此,虽然 UTF-8 可能是基于 Linux/OSX 的系统的默认输出类型,但如果有使用 UTF-16 Little Endian 进行输出编码的选项,这将有助于在将脚本移至目标系统。
最后要考虑的一件事:您提到“MySQL 转储”是一种潜在的“可靠格式”,这些转储包括 DDL(即CREATE TABLE)和 DML(即INSERT)语句。如果您有能力编写包含 DDL 语句(如有必要)和 DML 语句的脚本,那么您就不必担心任何格式问题。只需将 CSV 数据转换为INSERT语句即可。您将面临的唯一问题是无法测试脚本。但是,除了用于对象名称和字符串文字的引号或括号类型之外,确实很难出错:
INSERT INTO table (column1_name, column2_name, ...) VALUES (column1_val, column2_val, ...);
Run Code Online (Sandbox Code Playgroud)
为了让事情变得更容易:
[和](例如[Customers]),或双引号:("例如"Customers")'. (例如'some text')NVARCHAR/XML列,可以在前面的那些文字与资本“N”: N (例如N'some unicode text')YYYY-MM-DD HH:mm:ss.mmm应该没问题)VARCHAR(MAX)和VARBINARY(MAX)。NVARCHAR(MAX).由于问题中提到了 MySQL,即使是间接提到的,我认为使用mysqldump进行测试以查看它实际可以达到的接近程度不会有什么坏处。我使用了以下选项:
INSERT INTO table (column1_name, column2_name, ...) VALUES (column1_val, column2_val, ...);
Run Code Online (Sandbox Code Playgroud)
一些注意事项:
utf8以来的字符集utf16le,ucs2以及其他一些未在此特定情况下允许:-(--skip-add-drop-table和--quote-names-- 可能不需要明确说明,因为它们可能被暗示--compatible=mssqlvarchar长度为 8001 或更多的列,则需要将这些长度转换为字符串,MAX以便生成的数据类型VARCHAR(MAX)代替VARCHAR(20000).?),除非您能找到一种方法来为这些字符串文字加上大写前缀- N. 沿着这些相同的路线,CREATE TABLE需要针对任何 Unicode 列调整语句,使它们是NCHAR/NVARCHAR而不是CHAR/ VARCHAR。非 Unicode 列可以保留为CHAR/ VARCHAR。PS 为了完整起见,因为它涉及将数据从 MySQL 迁移到 SQL Server,Microsoft 确实有一个Migration Assistant,但是据我目前所知,它需要从 SQL Server 连接到 MySQL,并且无法处理转储文件.
更新
新信息(来自对此答案的评论):
来源是从当前存储在 CSV 文件中的德语网页中抓取的数据。如果这是一个可靠的向量,我可以轻松地将它从那里导入到 MySQL/Postgres 中。
所以这里有一个想法。如果您可以将这些数据放入一个 RDBMS 中,那么为什么不能将其放入另一个 RDBMS 中呢?假设您无论如何要设置一个临时的 Windows VM 进行测试,您可以:
BACKUP这个数据库RESTORE 备份文件到一个新的数据库中,使用新名称(不是原来的名称)DROP 新建/数据迁移数据库虽然这确实需要您编写 T-SQL 脚本,但它不需要任何额外的软件或安装,并且数据已经在正确数据类型的列中,不需要解析:-)。
PS 同样,为了完整起见,我还将 SQL Server Data Tools (SSDT) 作为一种可能的解决方案,因为它可以将架构和数据导出到单个.dacpac文件中,然后将其导入到目标中。但是,这确实需要安装 SSDT。但是,您不必编写 T-SQL 脚本,因为 SSDT 会为您处理所有 SQL。
| 归档时间: |
|
| 查看次数: |
1339 次 |
| 最近记录: |