【发布时间】:2017-01-04 16:24:49
【问题描述】:
让我先解释一下我的设置,然后再告诉你我正在处理的问题:
我有两个数据库服务器:SQL 2008 和 MySql。我在 SQL 中有一个过程,它首先删除 MySql 中的一个表,然后用 SQL 本身的一些数据填充它。对于这两个操作,我都使用 OPENQUERY。但是,如您所知,它不知道支持大数据。即使在 MySql 中截断表也变得非常慢(删除 60k 行需要 14 分钟......太疯狂了!)。
所以我发现我可以使用这种语法进行截断:
在 LINKEDSERVER 执行('TRUNCATE TABLE table_name')
但是我还没有找到通过这个将 SQL 表的结果插入我的 MySql 表的语法。当我插入静态数据时它可以正常工作,例如这个例子:
EXEC ('INSERT INTO table_name (row1, row2) VALUES (value1, value2)') AT LINKEDSERVER
但我想插入来自 SQL 的结果,正如我所说的那样:
EXEC ('INSERT INTO table_name (row1, row2) SELECT r1, r2 FROM SQL_DB.sql_table_name') AT LINKEDSERVER
我敢打赌我做不到,因为在那种语法中,我在 MySql 服务器中执行 exec 并且 SQL 表不存在那里。那么如何在“EXEC() AT”语法中引用我的 SQL 表呢?
谢谢。
【问题讨论】:
-
为什么需要使用 EXEC() AT?为什么不插入 LINKEDSERVER...tablename SELECT ... FROM ...?
-
> 那么我如何在“EXEC() AT”中引用我的 SQL 表简而言之,你不能,EXEC 执行的查询(有或没有 AT)在不同的范围内运行(在您的情况下,这是在 MySQL 上)并且您无法从 MySQL 访问 SQL Server 中的表。您坚持使用 OPENQUERY,或者您可以生成 INSERT INTO 语句(使用字符串的动态查询)并在 MySQL 服务器上执行,但这应该是计划 Z。SSIS 包而不是链接服务器怎么样?
-
感谢您的回答。我告诉过要使用 SISS,但我还没有尝试过,因为我在这个 SQL 服务器上没有那个模块。我试图通过 LinkedServer 让它工作。
-
@AaronBertrand,我无法让 INSERT LINKEDSERVER...tablename SELECT ... FROM ... 工作。到目前为止,我无法引用没有 OPENQUERY 或 EXEC() AT 的 LinkedServer。
-
“无法上班”是什么意思?许多其他人拥有从 SQL Server 到 MySQL 的功能链接服务器。无论如何,我同意 Pred,如果根本问题是您将 很多 数据从 SQL Server 移动到 MySQL,那么无论如何我都会避免链接服务器/EXEC AT/OPENQUERY。不要试图用三轮车做自卸车的工作。
标签: mysql sql-server-2008 linked-server