繁体   English   中英

“直接执行SQL; 使用SCOPE_IDENTITY / IDENT_CURRENT时出现“无光标”错误

[英]“Executing SQL directly; no cursor” error when using SCOPE_IDENTITY/IDENT_CURRENT

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

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

query_first是从查询的第一个字段返回第一个结果的函数(基本上等效于.net上的execute_scalar())。

完整的错误消息:

您可以尝试使用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')

OUTPUT:

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'

OUTPUT:

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

(3 row(s) affected)

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

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

暂无
暂无

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

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