Nella mia applicazione web PHP sto cercando di perfezionare la logica che, un valore definito dall'utente, assembla una query Transact-SQL che filtra su quel valore. La query viene quindi eseguita utilizzando il driver ODBC. La complicazione è che il filtraggio verrà eseguito solo sui campi derivati. Funziona perfettamente, tranne quando il campo derivato è un campo creato usando un'espressione CASE.CASE in MSSQL clausola WHERE - odbc error
Così, per esempio, ho un campo derivato come il seguente:
CASE WHEN [text_result] IS NOT NULL THEN [text_result] ELSE
CASE WHEN [last_event] = 1 THEN 'processed' ELSE 'unprocessed' END
END
Se provo e filtrare questo utilizzando il valore "non processato", quindi la query finale assemblato è ovviamente qualcosa di simile a quanto segue :
SELECT * FROM table WHERE
CASE WHEN [text_result] IS NOT NULL THEN [text_result] ELSE
CASE WHEN [last_event] = 1 THEN 'processed' ELSE 'unprocessed' END
END = 'unprocessed'
Tuttavia quando questo viene eseguito ricevo il seguente errore:
Warning: odbc_execute(): SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'from'., SQL state 37000 in SQLDescribeParameter in
Ho provato a eseguire SQL Profiler e ho scoperto che sembra che l'errore sia stato generato durante la preparazione iniziale dell'istruzione e che gli app di SQL di preparazione istruzioni stiano troncando l'espressione dal nome del campo. Così appare:
SET FMTONLY ON select CASE WHEN [text_result] from table where 1=2 SET FMTONLY OFF go
Questo è confermato quando eseguo l'istruzione SQL generata tramite MSSQL management studio e funziona perfettamente!
Spero che tutto abbia un senso. Se qualcuno ha qualche consiglio se questo problema è risolvibile o se è solo un bug nel driver sarebbe fantastico!
Questo è il PHP che sto usando per eseguire la query assemblata (estratto da una classe):
$link = odbc_connect($strConnectionString,$username,$password);
$rResult = odbc_prepare($link,$qry);
$success = odbc_execute($rResult,$parameters);
var_dump ($ qry, $ parametri):
string 'SELECT * FROM table WHERE
CASE WHEN [text_result] IS NOT NULL THEN [text_result] ELSE
CASE WHEN [last_event] = 1 THEN 'processed' ELSE 'unprocessed' END
END = ?'
array (size=1)
0 => string 'unprocessed'
mostrare il vostro blahblah php. – Mihai
Certo, php aggiunto. – Raiden616
Esegui 'var_dump ($ qry, $ parameters)' prima del codice che hai condiviso. –