6

我有一个使用 OpenQuery 的链接服务器语句:

SELECT mycol1, mycol2, mycol3 
FROM OPENQUERY(MYLINKEDSERVER, 'SELECT * FROM mysqldb.table')

以上在 SSMS 中毫无疑虑地工作。当我使用 PHP MySQL 包装器在 Web 应用程序上运行此查询时(使用相同的 SQL Server 凭据),我必须插入以下 2 个语句:

设置 ANSI_NULLS ON

设置 ANSI_WARNINGS ON

我已经通读了 ANSI_NULLS 和 ANSI_WARNINGS 的定义,但不太明白为什么必须将它们设置为 on 才能使查询在 PHP 中运行。

有谁知道原因?

我的链接服务器是一个 MySQL 实例。

4

3 回答 3

5

做了一些挖掘。简而言之,这意味着如果您正在针对不是 SQL Server 框的链接服务器运行查询,那么您很可能需要打开这两个功能来标准化某些比较运算符的处理方式不同的数据库。

假设,未来版本的 SQL Server 将默认将 SET_NULLS 设置为 ON 并且没有选项可以更改它

于 2013-06-06T16:05:42.303 回答
1

在 PHP 中:

  1. 首先发出 SET 命令 „SET ANSI_NULLS ON; 设置 ANSI_WARNINGS 开;“
  2. 然后执行其他命令,例如 SELECT * FROM customers ....;

如果将它们全部组合在一个脚本中:

   SET ANSI_NULLS ON; 
   SET  ANSI_WARNINGS ON;
   SELECT * FROM customers ...

发出错误。对我有用,结合两个 MS SQL 服务器。

于 2014-12-12T12:49:56.067 回答
0

这几乎是这个问题的重复。请注意,在这种情况下返回的错误消息是:

异构查询需要为连接设置 ANSI_NULLS 和 ANSI_WARNINGS 选项。这确保了一致的查询语义。启用这些选项,然后重新发出您的查询

事实上,文档确实说:

SET ANSI_NULLS 应设置为 ON 以执行分布式查询

它对 SET ANSI_WARNINGS 有相同的注释。我怀疑正如 Álvaro 所建议的那样,您的 PHP 代码隐藏了一个错误,并且很有可能就是上面提到的那个。DBA 网站上的这个问题更详细。

于 2013-05-29T18:52:57.723 回答