使用 SCOPE_IDENTITY/IDENT_CURRENT 时出现“直接执行 SQL;没有游标”错误
Posted
技术标签:
【中文标题】使用 SCOPE_IDENTITY/IDENT_CURRENT 时出现“直接执行 SQL;没有游标”错误【英文标题】:"Executing SQL directly; no cursor" error when using SCOPE_IDENTITY/IDENT_CURRENT 【发布时间】:2010-04-28 15:28:51 【问题描述】:谷歌上没有太多关于这个错误的信息,所以我在这里问。我正在将 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 行
【问题讨论】:
【参考方案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)
【讨论】:
【参考方案2】:我不确定您如何执行实际的插入语句,但 scope_identity() 只会返回该会话的最后一个标识值,即相同的 SPID。
如果您连接到数据库并执行插入,然后再次连接到数据库,scope_identity() 将始终返回 NULL,因为它们处于两个不同的会话中。
【讨论】:
连接是在脚本开始时建立的,从不关闭。 (对不起,我不知道如何为这个网站正确格式化) $connStr = "Driver=SQL Server Native Client 10.0;Server=$this->server;Database=$this->database ;"; $this->link_id = odbc_connect($connStr,$this->user,$this->pass);每个查询:odbc_exec($this->link_id,$sql);以上是关于使用 SCOPE_IDENTITY/IDENT_CURRENT 时出现“直接执行 SQL;没有游标”错误的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)