2010-04-28 5 views
2

Об этой ошибке не было много, поэтому я спрашиваю здесь. Я переключу веб-приложение PHP с помощью MySQL на SQL Server 2008 (используя ODBC, а не php_mssql). Выполнение запросов или что-то еще не является проблемой, но когда я пытаюсь сделать scope_identity (или любые подобные функции), я получаю сообщение об ошибке «Выполнение SQL напрямую, без курсора». Я делаю это сразу после вставки, поэтому он все равно должен быть в области видимости. Запуск такой же инструкции insert, что запрос для идентификатора вставки отлично работает в SQL Server Management Studio. Вот мой код прямо сейчас (все остальное в классе обертке базы данных отлично работает для других запросов, так что я буду считать, что это не относится прямо сейчас):Ошибка «Выполнение SQL напрямую, без курсора» при использовании SCOPE_IDENTITY/IDENT_CURRENT

function insert_id(){ 
    return $this->query_first("SELECT SCOPE_IDENTITY() as insert_id"); 
} 

query_first является функцией, которая возвращает первый результат первое поле запроса (в основном эквивалент execute_scalar() на .net).

Полное сообщение об ошибке: Предупреждение: odbc_exec() [function.odbc-ВЫПЛН]: Ошибка SQL: [Microsoft] [SQL Server Native Client 10.0] [SQL Server] Выполнение SQL непосредственно; нет курсора, SQL состояние 01000 в SQLExecDirect в 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) 
0

Я не уверен, как вы выполняете фактическую инструкцию insert, но scope_identity() возвращает только последнее значение удостоверения для этого сеанса, то есть тот же SPID.

Если вы подключаетесь к БД и выполняете вставку, а затем снова подключаетесь к БД, то scope_identity() всегда возвращает NULL, поскольку они находятся в двух разных сеансах.

+0

Соединение производится в начале сценария и никогда не закрывается. (Извините, я не знаю, как правильно отформатировать этот сайт) $ connStr = "Driver = {Собственный клиент SQL Server 10.0}; Server = {$ this-> server}; Database = {$ this-> база данных};"; $ this-> link_id = odbc_connect ($ connStr, $ this-> user, $ this-> pass); каждый запрос: odbc_exec ($ this-> link_id, $ sql); – Chris

Смежные вопросы