》直接执行SQL;没有光标”使用 SCOPE_IDENTITY/IDENT_CURRENT 时出错

发布于 2024-08-30 19:25:33 字数 703 浏览 4 评论 0原文

谷歌上没有太多关于这个错误的信息,所以我在这里问。我正在将 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())。

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

There wasn't much on google about this error, so I'm asking here. I'm switching a PHP web application from using MySQL to SQL Server 2008 (using ODBC, not php_mssql). Running queries or anything else isn't a problem, but when I try to do scope_identity (or any similar functions), I get the error "Executing SQL directly; no cursor". I'm doing this immediately after an insert, so it should still be in scope. Running the same insert statement then query for the insert ID works fine in SQL Server Management Studio. Here's my code right now (everything else in the database wrapper class works fine for other queries, so I'll assume it isn't relevant right now):

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

query_first being a function that returns the first result from the first field of a query (basically the equivalent of execute_scalar() on .net).

The full error message:
Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][SQL Server Native Client 10.0][SQL Server]Executing SQL directly; no cursor., SQL state 01000 in SQLExecDirect in C:[...]\Database_MSSQL.php on line 110

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蓝梦月影 2024-09-06 19:25:33

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

you could try using the OUTPUT clause as a work around:

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

this single statement will insert the row and return a result set of the identity values.

working sample:

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)

this is also good if you insert multiple rows at one time:

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)
原来分手还会想你 2024-09-06 19:25:33

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

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

I'm not sure how you executing the actual insert statement but scope_identity() will only return the last identity value for that session i.e the same SPID.

If you connect to the DB and perform the insert and then connect to the DB again scope_identity() will always return NULL as they are in two different sessions.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文