使用SCOPE_IDENTITY / IDENT_CURRENT时“直接执行SQL;没有游标”错误

时间:2010-04-28 15:28:51

标签: php sql sql-server odbc cursor

谷歌上没有太多关于这个错误,所以我在这里问。我正在将PHP Web应用程序从使用MySQL切换到SQL Server 2008(使用ODBC,而不是php_mssql)。运行查询或其他任何问题都不是问题,但是当我尝试执行scope_identity(或任何类似的函数)时,我收到错误“直接执行SQL;没有游标”。我在插入后立即执行此操作,因此它仍应在范围内。运行相同的insert语句然后查询插入ID在SQL Server Management Studio中正常工作。这是我现在的代码(数据库包装器类中的其他所有内容适用于其他查询,因此我认为它现在不相关):

function insert_id(){
    return $this->query_first("SELECT SCOPE_IDENTITY() as insert_id");
}

query_first是一个函数,它返回查询第一个字段的第一个结果(基本上相当于.net上的execute_scalar())。

完整的错误消息: 警告:odbc_exec()[function.odbc-exec]:SQL错误:[Microsoft] [SQL Server Native Client 10.0] [SQL Server]直接执行SQL;没有游标。,C语言中的SQLExecDirect中的SQL状态01000:第110行的

2 个答案:

答案 0 :(得分:1)

您可以尝试使用OUTPUT子句作为解决方法:

INSERT INTO YourTable
        (col1, col2, col3)
        OUTPUT INSERTED.YourIdentityCol as insert_id
    VALUES (val1, val2, val3)

此单个语句将插入行并返回标识值的结果集。

工作样本:

create table YourTestTable (RowID int identity(1,1), RowValue varchar(10))
go

INSERT INTO YourTestTable
        (RowValue)
        OUTPUT INSERTED.RowID as insert_id
    VALUES
        ('abcd')

输出:

insert_id
-----------
1

(1 row(s) affected)

如果一次插入多行,这也很好:

INSERT INTO YourTestTable
        (RowValue)
        OUTPUT INSERTED.RowID as insert_id
    SELECT 'abcd'
    UNION SELECT '1234'
    UNION SELECT 'xyz'

输出:

insert_id
-----------
2
3
4

(3 row(s) affected)

答案 1 :(得分:0)

我不确定你是如何执行实际的insert语句但是scope_identity()只会返回该会话的最后一个标识值,即相同的SPID。

如果您连接到数据库并执行插入,然后再次连接到数据库,则scope_identity()将始终返回NULL,因为它们位于两个不同的会话中。