谷歌上没有太多关于这个错误,所以我在这里问。我正在将PHP Web应用程序从使用MySQL切换到SQL Server 2008(使用ODBC,而不是php_mssql)。运行查询或其他任何问题都不是问题,但是当我尝试执行scope_identity(或任何类似的函数)时,我收到错误“直接执行SQL;没有游标”。我在插入后立即执行此操作,因此它仍应在范围内。运行相同的insert语句然后查询插入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;没有游标。,C语言中的SQLExecDirect中的SQL状态01000:第110行的
答案 0 :(得分: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)
答案 1 :(得分:0)
我不确定你是如何执行实际的insert语句但是scope_identity()只会返回该会话的最后一个标识值,即相同的SPID。
如果您连接到数据库并执行插入,然后再次连接到数据库,则scope_identity()将始终返回NULL,因为它们位于两个不同的会话中。