2016-09-29 3 views
2

Упрощенный пример Это в хранимой процедуреPHP преобразует NULL для пустых строк в MSSQL хранимых процедур

select coalesce('(' + phone + ') ', '(' + number + ') ' 
from example_table 

так, если телефон не NULL я вернусь (телефон) еще вернусь (номер).

Причина этого в том, что MSSQL сконфигурирован как CONCAT_NULL_YIELDS_NULL, в основном, если в concat есть NULL, все становится NULL.

Это работает, как ожидалось, когда я запускаю его от клиента (SQLPro)

Когда я вызываю эту SP из PHP кода я получаю это() скобки только тогда, когда значение телефона NULL и чтение вокруг него, кажется, что PHP переводит NULL в пустую строку.

Кто-нибудь знает, как обойти это? Может быть, конфигурация в php.ini заставит PHP обрабатывать значения NULL как специальное значение NULL вместо перевода их в пустые строки?

ответ

0

Просто измените выражение чего-то, что не зависит от конфигурации:

select '(' + coalesce(phone, number) + ') ' 
from example_table; 

Если у вас есть более сложные выражения, то вам, возможно, необходимо использовать явное case:

select (case when phone is not null then '(' + phone + ') ' 
      else '(' + number + ') ' 
     end) 

Конечно, первая версия проще, но это может быть более обобщаемо.

+1

Это имеет смысл. К сожалению, это была устаревшая система, которая переносится в AWS, поэтому потребовалось бы изменить десятки хранимых процедур. Однако после некоторого дальнейшего расследования я выяснил проблему, и, оказывается, PHP не имеет к этому никакого отношения. Оказывается, что новая БД имела CONCAT_NULL_YIELDS_NULL по умолчанию, как ожидалось, но затем свойство было переопределено AWS и выключено. – Biondo