php - 如何在 PHP 中使用 Microsoft SQL 驱动程序选择 SCOPE_IDENTITY()?

标签 php sql-server sqlsrv

我有一个特殊的 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/

相关文章:

sql-server - SQL Server 触发器循环

php sqlsrv 扩展未加载

php - 创建文件的文件所有权

PHP如何覆盖文件的特定部分

c# - 如何在 C# SqlCommand 中为表指定架构限定符?

python - pandas read_sql_query 将32位数据转换为64位

codeigniter - 通过 CodeIgniter 连接到 SQL Server

php - 如何查询具有单引号的数据数组?

javascript - 如何阻止 setInterval 在 .load() 上创建多个实例?

php - 将单独的月、日和年值转换为时间戳