【问题标题】:Openquery insert not workingOpenquery插入不起作用
【发布时间】:2014-06-12 09:03:13
【问题描述】:

我有一个链接到 MSSQL-server 的 MySQL 服务器,我正在尝试向 MySQL 服务器上的表 admin_user 插入数据,但最终得到错误:

无法处理对象“dbo.admin_user”。 OLE DB 提供程序 链接服务器“MYDB”的“MSDASQL”表示对象 没有列或当前用户没有该列的权限 对象。

这很好用:

SELECT * FROM openquery([MYDB], 'SELECT * FROM admin_user')

这会得到错误:

INSERT into openquery([MYDB], 'dbo.admin_user') values ('Testi','Testaaja','me@google.com','koe','','','','','','1','N;','','')

这是我用于创建 ODBC 连接的用户的权限

| xx.xxx.xxx.xx |我 | *qweqweqwdq2edqdadasd| 是 |是 |是 |是 |是 | 是 |是 |是 |是 |是 | ñ |是 |是 |是 |是 |是的
|是 |是 |是 |是的
|是 |是 |是 |是的
|是 |是 |是 |是 | 是 | | | |
| 0 | 0 | 0 | 0 | |空|

>     | %             | me | *asdasadasdsadasdasdsad| Y           | Y           | Y           | Y           | Y           |
> Y         | Y           | Y             | Y            | Y         | Y
> | Y               | Y          | Y          | Y            | Y        
> | Y                     | Y                | Y            | Y         
> | Y                | Y                | Y              | Y            
> | Y                  | Y                | Y          | Y            |
> Y                      |          |            |             |        
> |             0 |           0 |               0 |                    0
> |        | NULL                  |

我的目录是 bitnami_magento,我使用

配置了提供程序字符串

DRIVER=(MySQL ODBC 5.3 ANSI 驱动程序);服务器= XX.XXX.XXX.XXX;PORT=3306;DATABASE=bitnami_magento; USER=me;PASSWORD=mypass;OPTION=3;

我还取消了提供程序选项 (MSDASQL) 中的“仅零级”框,并确保允许 ad_hoc 查询。我做错了什么?

有我遵循的说明 http://dbperf.wordpress.com/2010/07/22/link-mysql-to-ms-sql-server2008/

【问题讨论】:

  • 我尝试从 MySQL -server 插入 root@localhost 并且效果很好。用户我拥有所有权限,所以我不知道为什么它不能用 openquery 插入
  • 您是否尝试过不带“dbo”的插入。
  • 是的。它对错误消息没有影响。

标签: mysql sql sql-server openquery


【解决方案1】:

您的查询有误:

在 OPENQUERY() 中,您必须使用 MySQL 表名而不是 MSSQL 名称(如果您想插入 MySQL 表)。

下面的语法应该可以工作

INSERT INTO OPENQUERY([MYDB], 'SELECT * FROM mysqlDbName.mysqlTableName') VALUES
('Testi','Testaaja','me@google.com','koe','','','','','','1','N;','','')

请将mysqlDbName.mysqlTableName相应地更改为您的MySQL数据库和表名。

【讨论】:

  • 实际上您只需要 MYDB(带或不带括号),因为它是在链接服务器属性中定义为“链接服务器:”的链接数据库的名称,提供程序字符串将注意您将使用“正确”的数据库
  • 没错,这是完整的语法。另请注意,我将SELECT * FROM 部分添加到OPENQUERY
  • 您的查询仍然需要虚拟 where 子句,否则它会很慢,因为它会得到一个结果集。您应该设置它,使其不会得到任何结果,例如 where 1=0
【解决方案2】:

问题是我是个白痴。 Openquery 的语法要求返回一个结果集。

因此,它显然需要将“虚拟查询”作为实际查询的一部分并入,以便获得结果集作为响应。写“where 1=0”会使查询更快,因为它不会得到任何实际结果作为响应。

工作示例:

 insert openquery(MYDB, 'select firstname from admin_user where 1=0') values ('3','Testi','Testaaja','me@google.com','koe12','koe22','','','','0','0','1','','','')

OpenQuery 需要返回一个结果集,但是 UPDATE、DELETE、 和与 OpenQuery 一起使用的 INSERT 语句不返回 结果集。

http://support.microsoft.com/kb/270119/fi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-25
    • 2014-04-12
    • 1970-01-01
    • 2013-12-27
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多