我有一个特殊的 MSSQL 语句,用于检索已存在的指定行的标识,或者插入然后检索该标识。此 SQL 似乎在 SQL Management Studio 以及我的几个 .NET C# 应用程序中运行良好。
不幸的是,我被要求使用 PHP 来完成这项特定任务,而我在尝试使用 PHP 和官方 Microsoft SQL 驱动程序时遇到了很大困难。
该语句在插入后不返回 ID(或者如果是,我无法检索它)。有人可以看看我哪里出错了吗?
我使用的是 PHP 5.3.23 和 Microsoft SQL Driver 3.0。这是我的代码:
$sql = ''
. 'IF (SELECT COUNT(*) FROM users WHERE sAMAccountName = ?) = 0 '
. 'BEGIN '
. 'INSERT INTO users (role, sAMAccountName, fullName) '
. 'VALUES (1, ?, ?) '
. 'SELECT SCOPE_IDENTITY() '
. 'END '
. 'ELSE SELECT id FROM users WHERE sAMAccountName = ?';
$params = array($requester, $requester, $fullName, $requester);
$query = $this->SqlQuery($sql, $params);
function SqlQuery($sql, array $params) {
$conn = $this->SqlConnection(null, null, null, null); // x4 null = use default connection options
$query = sqlsrv_query($conn, $sql, $params);
if ($query) {
sqlsrv_fetch($query);
echo 'Result: ' . sqlsrv_get_field($query, 0); // This should return an ID regardless
sqlsrv_close($conn);
}
}
这是结果 HTML(无结果):
Result:
最佳答案
您需要在查询开头添加SET NOCOUNT ON;
。
您的INSERT
语句实际上返回一些内容:一个空记录集加上消息“(1行受影响)”。 SSMS 只是连接所有记录集,但在 sqlsrv 中,您必须显式前进到第二个记录集才能查看 SCOPE_IDENTITY()
结果。通过关闭行计数功能,无趣的结果集将被取消,它将执行您想要的操作。
关于php - 如何在 PHP 中使用 Microsoft SQL 驱动程序选择 SCOPE_IDENTITY()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24738702/