PHP 将 NULL 转换为 MSSQL 存储过程中的空字符串

Posted

技术标签:

【中文标题】PHP 将 NULL 转换为 MSSQL 存储过程中的空字符串【英文标题】:PHP translates NULL to empty strings in MSSQL stored procedures 【发布时间】:2016-09-29 01:47:15 【问题描述】:

简化示例 这是在存储过程中

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

所以如果电话不为 NULL,我会返回(电话),否则我会返回(号码)。

原因是MSSQL被配置为CONCAT_NULL_YIELDS_NULL,基本上如果concat中有NULL一切都变成NULL了。

当我从客户端 (SQLPro) 运行它时,它按预期工作

当我从 php 代码中调用这个 SP 时,只有当 phone 的值为 NULL 时,我才会得到这个 () 括号,并且阅读它似乎 PHP 将 NULL 转换为空字符串。

有人知道解决这个问题的方法吗?也许 php.ini 中的配置会强制 PHP 将 NULL 值视为特殊值 NULL 而不是将它们转换为空字符串?

【问题讨论】:

【参考方案1】:

只需将表达式更改为不依赖于配置的内容即可:

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

如果您有更复杂的表达式,那么您可能需要使用显式的case

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

当然,第一个版本更简单,但这可能更通用。

【讨论】:

这是有道理的。不幸的是,这是一个正在迁移到 AWS 的遗留系统,因此需要更改数十个存储过程。然而,经过一些进一步的调查,我发现了这个问题,事实证明 PHP 与它无关。事实证明,新数据库的 CONCAT_NULL_YIELDS_NULL 按预期默认为打开,但随后该属性被 AWS 覆盖并关闭。

以上是关于PHP 将 NULL 转换为 MSSQL 存储过程中的空字符串的主要内容,如果未能解决你的问题,请参考以下文章

将空值传递给 Python 中的存储过程

将 CTE 存储过程转换为 Mysql 兼容的数据库查询

使用 SQL Server 2012 中的 MSSQL_Query 的 PHP 调用存储过程返回无效值

PHP 7和MSSQL PDO:使用输入和输出参数调用存储过程

PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)

使用 php MSSQL 转换双倍时间格式 [关闭]