繁体   English   中英

如何在PHP中使用Microsoft SQL Driver选择SCOPE_IDENTITY()?

[英]How to select SCOPE_IDENTITY() using Microsoft SQL Driver in PHP?

我有一个特殊的MSSQL语句,该语句用于检索指定行的标识,该指定行要么已存在,要么插入,然后检索该标识。 此SQL在SQL Management Studio以及我的几个.NET C#应用程序中似乎都很好用。

不幸的是,我被要求使用PHP来完成此特定任务,而尝试使用PHP和正式的Microsoft SQL驱动程序却遇到了很大的困难。

该语句在INSERT之后不返回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: 

不知道这是否是您的选择,但是:我将把SQL语句更改为存储过程,并包括标识的返回。 一旦存储过程对语句进行了这些更改

'SELECT SCOPE_IDENTITY() '

'SELECT SCOPE_IDENTITY() as id'

然后在PHP中,您应该能够将id作为数据表访问。 存储过程将返回数据作为数据表,不确定在PHP方面,我是.NET

如果您需要将语句转换为存储的proc的帮助,请告诉我。

编辑:
假设sAMAccountName是此表上的主键,并且您在问题中指出,您只能在INSERT期间无法找回身份。 然后将SQL更改为此将为您解决问题。

$sql = ''
    . 'IF (SELECT COUNT(*) FROM users WHERE sAMAccountName = ?) = 0 '
    . 'BEGIN '
    . 'INSERT INTO users (role, sAMAccountName, fullName) '
    . 'VALUES (1, ?, ?) '
    . 'END '
    . 'SELECT id FROM users WHERE sAMAccountName = ?';

您可以尝试一下。 删除多余的单引号和连接,并应用Dbloch的建议。

$sql = 'IF (SELECT COUNT(*) FROM users WHERE sAMAccountName = ?) = 0
            BEGIN
            INSERT INTO users (role, sAMAccountName, fullName)
            VALUES (1, ?, ?) 
            SELECT SCOPE_IDENTITY() as id
            END
            ELSE SELECT id FROM users WHERE sAMAccountName = ?';

您需要SET NOCOUNT ON; 在查询开始时。

您的INSERT语句实际上返回了一些内容:一个空的记录集以及消息“(受影响的1行)”。 SSMS仅连接所有记录集,但是在sqlsrv中,您必须显式前进到第二个记录集才能看到SCOPE_IDENTITY()结果。 通过关闭行计数功能,可以消除无用的结果集,它将满足您的要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM