Ошибка «Выполнение SQL напрямую; без курсора» при использовании SCOPE_IDENTITY / IDENT_CURRENT - PullRequest
2 голосов
/ 28 апреля 2010

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

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

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

Полное сообщение об ошибке: Предупреждение: odbc_exec () [function.odbc-exec]: ошибка SQL: [Microsoft] [Собственный клиент SQL Server 10.0] [SQL Server] Прямое выполнение SQL; без курсора. Состояние SQL 01000 в SQLExecDirect в C: [...] \ Database_MSSQL.php в строке 110

Ответы [ 2 ]

1 голос
/ 28 апреля 2010

вы можете попробовать использовать предложение 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 голосов
/ 29 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...