CFQuery получает GeneratedKey из множественной вставки в SQL Server

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

<cfquery>
        CREATE TABLE TempPerson
            (
            PersonID INT NOT NULL IDENTITY (1,1) PRIMARY KEY,
            LastName varchar(20),
            FirstName varchar(20)
            );
</cfquery>

<cfquery result="qrResult">
    INSERT INTO TempPerson( lastName, firstName )
    VALUES( 'Smith', 'Michael' ), ('Jones','Ricky')
</cfquery>

<cfdump var="#qrResult#">

Я запускал это как в CF10, так и в Railo 4.2 в сочетании с SQL Server и MySQL.

CF10 с SQL Server — GeneratedKey не возвращен. Только переменная RecordCount

RecordCount = 2

CF10 с MySQL — получить столбцы идентификаторов в виде списка, но с неправильным числом записей

GeneratedKey = 1,2
RecordCount = 1

Railo 4.2 с SQL Server — получает только последний столбец идентификации

GeneratedKey = 2
RecordCount = 2

Railo 4.2 с MySQL — получение столбцов идентификаторов в виде списка и правильного количества записей

GeneratedKey = 1,2
RecordCount = 2

Таким образом, похоже, что в 4 перестановках нет согласованности. Но мой самый неотложный вопрос заключается в том, есть ли способ получить сгенерированные ключи из SQL Server, работающего с CF10. Есть?


person user2943775    schedule 07.08.2015    source источник
comment
Учитывая некоторые особенности более ранних версий, я начал использовать параметр SQL Server OUTPUT вместо результата cfquery. Старая запись в блоге ( больше не поддерживается). Это немного больше работы, но я нашел результаты более последовательными, чем результат cfquery для различных версий. Если вы не найдете работающее исправление для CF10, попробуйте его и посмотрите, работает ли оно.   -  person Leigh    schedule 07.08.2015
comment
Это, вероятно, работает для SQL Server, но я надеялся, что смогу использовать один и тот же синтаксис и код sql между двумя вариантами sql. Может быть, желаемое за действительное?   -  person user2943775    schedule 07.08.2015
comment
Возможно, принятие желаемого за действительное К сожалению, да. Их синтаксис/обработка отличаются.   -  person Leigh    schedule 07.08.2015


Ответы (1)


Использование вывода sql

<cfquery name="qrResult">
  INSERT INTO TempPerson( lastName, firstName )
  OUTPUT Inserted.PersonID
  VALUES( 'Smith', 'Michael' ), ('Jones','Ricky') 
</cfquery>

Затем его можно использовать как обычные данные

person James A Mohler    schedule 08.08.2015
comment
Одна небольшая поправка. OUTPUT вернет данные, как обычный набор результатов. Чтобы захватить его, вам нужен атрибут имени cfquery, а не результат. Примечание: очень жаль, что нет универсального эквивалента, который также работал бы с MySQL. Самое близкое, что вы можете получить, это триггер... - person Leigh; 09.08.2015