0

我想将数据从 MS SQL Server 数据库传输到 MySQL 数据库。因此,我在 MS SQL 中添加了一个链接服务器,以便我可以使用 Openquery 将数据插入 MySQL 数据库。我想优化数据传输的性能,我找到了提高 MySQL 中数据加载性能的指南。

一项优化包括禁用 AUTOCOMMIT 模式,但是我无法使用 Openquery 做到这一点。

我尝试了两种方式:

SELECT * from openquery(MYSQL,'SET autocommit=0') 

exec openquery(MYSQL,'SET autocommit=0') 

我得到了:

无法处理对象“SET autocommit=0”。链接服务器“MYSQL”的 OLE DB 提供程序“MSDASQL”指示该对象没有列或当前用户对该对象没有权限。

是否可以通过openquery执行这样的语句?

谢谢,米凯尔

4

2 回答 2

1

OPENDATASOURCE() 和 OPENROWSET() 允许临时服务器连接。您无需提前定义链接服务器。

OPENQUERY() 取决于提前定义的静态链接服务器

这是 MSDN 参考。

http://technet.microsoft.com/en-us/library/ms188427.aspx

大多数示例显示了使用 OPENQUERY() 作为命令的源或目标的 DML(SELECT、UPDATE、DELETE、INSERT)。您要做的是执行会话命令。因此它会失败。此外,您甚至可能不知道会话是否为下一次通话保持打开状态。

为什么不把MYSQL服务器上的逻辑打包成一个存储过程呢。存储过程可以通过使用四部分名称在链接服务器上执行吗?

例如:

INSERT INTO #results EXEC server.database..stored-proc

这假定 MYSQL 具有与 ORACLE 相同的对象结构。由于我不是 MYSQL 的人,我无法评论。我允许你研究这个小项目。

但这应该有效。它将允许您在 MYSQL 数据库中打包任何类型的逻辑。

于 2014-01-19T19:07:25.187 回答
0

如果您想使用 SSIS 将数据从 SQL Server 传输到 MYSQL。

要使 ADO.NET 目标正常工作,MySQL 数据库需要启用 ANSI_QUOTES SQL_MODE 选项。此选项可以全局启用,也可以针对特定会话启用。要为单个会话启用它:

1 - Create an ADO.NET Connection Manager which uses the ODBC driver
2 - Set the connection manager’s RetainSameConnection property to True
3 - Add an Execute SQL Task before your data flow to set the SQL_MODE – Ex. set sql_mode='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ANSI_QUOTES'
4 - Make sure that your Execute SQL Task and your ADO.NET Destination are using the same connection manager.

Matt Mason 在回复中这样做了。关键是第 2 项,使用相同的连接。

http://blogs.msdn.com/b/mattm/archive/2009/01/07/writing-to-a-mysql-database-from-ssis.aspx#comments

此外,CozyRoc 有一个自定义的 ODBC 驱动程序,它可能比来自 MYSQL 的免费驱动程序更快/更可靠。

http://cozyroc.com/ssis/odbc-destination

于 2014-01-21T13:39:27.790 回答