2013-05-29 16 views
6

Mi hai dichiarazioni server collegato utilizzando OpenQuery:Perché ANSI_NULLS e ANSI_WARNINGS devono essere impostati su on per le query server collegate in PHP?

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

Le opere di cui sopra senza remore in SSMS. Quando uso PHP involucri MySQL per eseguire la query su un'applicazione web (usando le stesse credenziali SQL Server), devo inserire i seguenti 2 dichiarazioni:

ANSI_NULLS impostato sul

SET ANSI_WARNINGS ON

Ho letto le definizioni per ANSI_NULLS e ANSI_WARNINGS, ma non capisco perché debbano essere impostati su on affinché la query funzioni in PHP.

Qualcuno conosce il motivo?

Il mio server collegato è un'istanza MySQL.

+1

Se non si aggiungono queste due righe, cosa succede? –

+7

Dio uccide un gattino. –

+0

@AbeMiessler Pagina non viene caricata, ma non vengono generati errori –

risposta

3

Ha scavato. In breve, significa che se stai eseguendo una query su un server collegato che non è una casella di SQL Server, allora è più che probabile che dovrai attivare queste due funzioni per standardizzare il modo in cui vengono gestiti alcuni operatori di confronto diversi database.

Presumibilmente, le versioni future di SQL Server avranno SET_NULLS impostata su ON per default senza possibilità di cambiarlo

+0

Da [documentazione] (https://msdn.microsoft.com/en-us/library/ms188048.aspx), * In una versione futura di SQL Server, ANSI_NULLS sarà sempre attivo e tutte le applicazioni che impostano esplicitamente l'opzione su OFF genererà un errore. Evitare l'utilizzo di questa funzionalità in un nuovo lavoro di sviluppo e pianificare di modificare le applicazioni che attualmente utilizzano questa funzionalità. * Questo si applica a SQL Server dal 2008 al 2015 e non richiede più in SQL Server 2016. – Raptor

0

Questo è quasi un duplicato di this question. Si noti che il messaggio di errore restituito in quel caso era:

query eterogenee richiedono le opzioni ANSI_NULLS e ANSI_WARNINGS da impostare per la connessione. Ciò garantisce una semantica delle query coerente. attivare queste opzioni, quindi eseguire nuovamente la query

E la documentation in effetti dice che:

ANSI_NULLS SET deve essere impostato su ON per l'esecuzione di query distribuite

Ha la same comment per SET ANSI_WARNINGS. Sospetto che, come suggerito da Álvaro, il tuo codice PHP stia nascondendo un errore e ci sono ottime possibilità che sia quello sopra menzionato. This question sul sito DBA entra molto più in dettaglio.

1

In PHP:

  1. Prima isssue il comando SET “SET ANSI_NULLS ON; SET ANSI_WARNINGS ON; "
  2. Quindi eseguire altri comandi come SELECT * FROM customers ....;

Se tutti si combinano in uno script: viene emesso

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

l'errore. Funziona per me combinando due server MS SQL.

+1

Penso che sia necessario rileggere la domanda - non stai rispondendo. –

Problemi correlati