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

时间:2014-07-14 14:19:31

标签: php sql-server sqlsrv

我有一个特殊的MSSQL语句,我用它来检索已经存在的指定行的标识,或者INSERT,然后检索该标识。这个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: 

3 个答案:

答案 0 :(得分:2)

不确定它是否适合您,但是:我会将SQL语句更改为存储过程,并包含身份的返回。一旦存储过程对语句进行了这些更改

'SELECT SCOPE_IDENTITY() '

'SELECT SCOPE_IDENTITY() as id'

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

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

编辑:
假设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 = ?';

答案 1 :(得分:1)

你可以尝试一下。删除额外的单引号和连接,并应用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 = ?';

答案 2 :(得分:1)

您在查询开头需要SET NOCOUNT ON;

您的INSERT语句实际上返回了一些内容:空记录集加上消息“(1行受影响)”。 SSMS只是连接所有记录集,但在sqlsrv中,您必须显式前进到第二个记录集才能看到SCOPE_IDENTITY()结果。通过关闭行计数功能,可以撤消不感兴趣的结果集,并且它可以执行您想要的操作。