2010-04-28 93 views
2

有关此错误的谷歌并没有太多,所以我在这里问。我正在使用MySQL切换PHP Web应用程序到SQL Server 2008(使用ODBC,而不是php_mssql)。运行查询或其他任何东西都不是问题,但是当我尝试执行scope_identity(或任何类似的函数)时,出现错误“直接执行SQL;无游标”。我在插入后立即执行此操作,因此它仍应在范围内。运行相同的插入语句,然后查询插入ID在SQL Server Management Studio中正常工作。这里是我的代码现在(一切都在数据库包装类其他工作正常的其他查询,所以我会认为它现在是不相关的):使用SCOPE_IDENTITY/IDENT_CURRENT时出现“直接执行SQL;无游标”错误

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; C中没有游标,SQL状态01000在SQLExecDirect的。[...] \ 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') 

OUTPUT:

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' 

OUTPUT:

insert_id 
----------- 
2 
3 
4 

(3 row(s) affected) 
0

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

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

+0

连接在脚本的开始处进行并且从不关闭。 (对不起,我不知道如何正确格式化这个网站) $ connStr =“Driver = {SQL Server Native Client 10.0}; Server = {$ this-> server}; Database = {$ this->数据库};”; $ this-> link_id = odbc_connect($ connStr,$ this-> user,$ this-> pass);每个查询: odbc_exec($ this-> link_id,$ sql); – Chris 2010-04-29 18:09:19

相关问题