[英]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.