为什么在PHP中链接服务器查询需要将ANSI_NULLS和ANSI_WARNINGS设置为on?

时间:2013-05-29 15:31:51

标签: php sql-server

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

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

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

  

SET ANSI_NULLS ON

     

SET ANSI_WARNINGS ON

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

有谁知道原因?

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

3 个答案:

答案 0 :(得分:4)

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

据推测,SQL Server的未来版本默认情况下SET_NULLS设置为ON,没有更改选项

答案 1 :(得分:1)

在PHP中:

  1. 首先是SET命令“SET ANSI_NULLS ON; SET ANSI_WARNINGS ON;“
  2. 然后执行其他命令,如SELECT * FROM customers ....;
  3. 如果将它们全部合并到一个脚本中:

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

    发出错误。 可以合并两个MS SQL服务器。

答案 2 :(得分:0)

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

  

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

事实上documentation确实说:

  

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

它具有SET ANSI_WARNINGS的same comment。我怀疑正如Álvaro建议的那样,你的PHP代码隐藏了一个错误,并且很有可能它是上面提到的那个。 DBA网站上的This question更加详细。