【问题标题】:"Executing SQL directly; no cursor" error when using SCOPE_IDENTITY/IDENT_CURRENT使用 SCOPE_IDENTITY/IDENT_CURRENT 时出现“直接执行 SQL;没有游标”错误
【发布时间】: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 行

【问题讨论】:

    标签: php sql sql-server odbc cursor


    【解决方案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);
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 2016-11-11
      相关资源
      最近更新 更多