》直接执行SQL;没有光标”使用 SCOPE_IDENTITY/IDENT_CURRENT 时出错
谷歌上没有太多关于这个错误的信息,所以我在这里问。我正在将 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以尝试使用 OUTPUT 子句作为解决方法:
此单个语句将插入行并返回标识值的结果集。
工作示例:
输出:
如果您一次插入多行,这也很好:
输出:
you could try using the OUTPUT clause as a work around:
this single statement will insert the row and return a result set of the identity values.
working sample:
OUTPUT:
this is also good if you insert multiple rows at one time:
OUTPUT:
我不确定如何执行实际的插入语句,但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.