2013-05-29 51 views
6

我有使用OPENQUERY鏈接服務器聲明:爲什麼需要爲PHP中的鏈接服務器查詢設置ANSI_NULLS和ANSI_WARNINGS?

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

上述工程在SSMS沒有疑慮。當我使用PHP MySQL的包裝上運行Web應用程序這個查詢(使用相同的SQL Server憑據),我不得不插入以下2個語句:

SET ANSI_NULLS ON

SET ANSI_WARNINGS ON

我已經閱讀了ANSI_NULLS和ANSI_WARNINGS的定義,但不太明白爲什麼必須將它們設置爲允許查詢在PHP中運行。

有誰知道原因?

我的鏈接服務器是一個MySQL實例。

+1

如果您不添加這兩行,會發生什麼情況? –

+7

上帝殺死一隻小貓。 –

+0

@AbeMiessler Page不加載,但不會引發錯誤 –

回答

3

做了一些挖掘。簡而言之,這意味着如果您針對不是SQL Server框的鏈接服務器運行查詢,那麼很可能需要將這兩個功能開啓以標準化某些比較運算符的處理方式不同的數據庫

據稱,SQL Server的未來版本將有SET_NULLS設置爲ON,在默認情況下沒有選擇去改變它

+0

從[documentation](https://msdn.microsoft.com/en-us/library/ms188048.aspx),*在SQL Server的未來版本中,ANSI_NULLS將始終爲ON,並且任何明確將該選項設置爲OFF將產生一個錯誤。避免在新的開發工作中使用此功能,並計劃修改當前使用此功能的應用程序。*這適用於SQL Server 2008到2015,並且不再需要在SQL Server 2016中使用。 – Raptor

0

這幾乎是this question的重複。請注意,在這種情況下,返回的錯誤信息是:

異類查詢需要ANSI_NULLS和ANSI_WARNINGS選項 爲連接設置。這確保了一致的查詢語義。 啓用這些選項,然後重新發出查詢

而且documentation事實上確實說:

SET ANSI_NULLS應該設爲ON執行分佈式查詢

它具有針對SET ANSI_WARNINGS的same comment。我懷疑,正如Álvaro所建議的那樣,您的PHP代碼隱藏了一個錯誤,並且很有可能是上面提到的錯誤。 DBA網站上的This question更詳細。

1

在PHP:

  1. 首先isssue SET命令「SET ANSI_NULLS ON; SET ANSI_WARNINGS ON;「
  2. 然後執行其他命令,如SELECT * FROM customers ....;

如果你在一個腳本結合他們所有:發出

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

錯誤。 適用於組合兩臺MS SQL服務器。

+1

我認爲您需要重新閱讀問題 - 你沒有回答。 –

相關問題