Openquery的特别声明

时间:2014-01-19 13:39:18

标签: mysql sql-server openquery

我想将数据从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”。 OLE DB提供程序   链接服务器“MYSQL”的“MSDASQL”表示该对象   没有列或当前用户没有权限   对象

是否可以通过openquery执行此类语句?

谢谢, 迈克尔

2 个答案:

答案 0 :(得分:1)

OPENDATASOURCE()和OPENROWSET()允许 add-hoc服务器连接。您不需要提前定义链接服务器。

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数据库中打包任何类型的逻辑。

答案 1 :(得分: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