使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)