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

对于PHP中的链接服务器查询,为什么需要将ANSI_NULLS和ANSI_WARNINGS设置为on?,php,sql-server,Php,Sql Server,我有一个使用OpenQuery的链接服务器语句: SELECT mycol1, mycol2, mycol3 FROM OPENQUERY(MYLINKEDSERVER, 'SELECT * FROM mysqldb.table') 上述工作在SSMS中毫无疑问。当我使用PHP MySQL包装器在web应用程序上运行此查询(使用相同的SQL Server凭据)时,我必须插入以下两条语句: 将ANSI_空值设置为ON 将ANSI_警告设置为ON 我已经通读了ANSI_null和ANSI_警告的

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

SELECT mycol1, mycol2, mycol3 
FROM OPENQUERY(MYLINKEDSERVER, 'SELECT * FROM mysqldb.table')
上述工作在SSMS中毫无疑问。当我使用PHP MySQL包装器在web应用程序上运行此查询(使用相同的SQL Server凭据)时,我必须插入以下两条语句:

将ANSI_空值设置为ON

将ANSI_警告设置为ON

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

有人知道原因吗


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

这几乎是一个MySQL实例的副本。请注意,在这种情况下返回的错误消息是:

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

事实上,报告确实说:

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


它设置了ANSI_警告。我怀疑,正如阿尔瓦罗所说,您的PHP代码隐藏了一个错误,很有可能就是上面提到的错误。在DBA网站上详细介绍了更多信息。

做了一些挖掘。简言之,这意味着如果要对不是SQL Server box的链接服务器运行查询,则很可能需要启用这两个功能,以标准化跨不同数据库处理某些比较运算符的方式

据推测,SQL Server的未来版本将在默认情况下将SET_NULLS设置为ON,并且在PHP中没有更改它的选项:

  • 首先发出SET命令“SET ANSI_NULLS ON”;将ANSI_警告设置为ON;"
  • 然后执行其他命令,如SELECT*FROM customers
  • 如果将它们组合在一个脚本中:

       SET ANSI_NULLS ON; 
       SET  ANSI_WARNINGS ON;
       SELECT * FROM customers ...
    
    发出错误消息。
    对我合并两个MS SQL Server很有用。

    如果你不添加这两行,会发生什么?上帝杀死了一只小猫。@AbeMiessler页面不会加载,但没有错误会抛出错误没有错误?真的吗?你可能只是在某个地方吃了异常?抱歉,如果我说了一些明显的事情,但是空白页面通常意味着你的脚本抛出了一个e错误,但您尚未将PHP配置为显示错误消息。在进一步操作之前,您需要确保能够看到错误消息;没有错误消息是不可能编写代码的。这里有一个问题。我认为您需要重新阅读这个问题-您没有回答它。在SQL Server的未来版本中,ANSI_NULLS将始终处于启用状态,并且任何应用程序xplicitly将选项设置为OFF将生成错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。这适用于SQL Server 2008至2015,在SQL Server 2016中不再需要此功能。