SQL Server Profiler показывает SCOPE_IDENTITY(), пока код ColdFusion не использует его ни в одном запросе

Я использую SQL Server 2008 R2 Profiler для отладки проблемы в приложении ColdFusion 7, которое было разработано кем-то другим, работающим в Windows 7 с SQL Server 2008 R2 в качестве бэкэнда. Первоначально приложение использовало MS Access 2003 в качестве бэкэнда, который впоследствии был преобразован в SQL Server 2008 R2. Профилировщик показывает следующий SQL, который использует SCOPE_IDENTITY(), но когда я выполняю поиск в корневом каталоге приложения с помощью утилиты поиска, ни один файл не имеет функции SCOPE_IDENTITY(), которая использовалась бы где-либо в их запросе SQL. База данных SQL Server для приложения не имеет хранимых процедур, представлений, функций и т. Д. Все запросы SQL являются встроенными запросами внутри файлов ColdFusion. Где тогда Profiler получает функцию SCOPE_IDENTITY():

declare @p1 int
set @p1=11
exec sp_prepexec @p1 output,N'@P1 datetimeoffset,@P2 varchar(8000),@P3 int,@P4 varchar(8000)',N'insert into ProductItems (item_date , item_description, item_type)
values (
@P1 ,
@P2 ,
@P3 , 
) select SCOPE_IDENTITY()','2015-10-19 00:00:00 +00:00','Test description',1
select @p1

ОБНОВЛЕНИЕ Хотя изначально приложение было разработано на CF 7, позже CF 7 было обновлено до CF9, и теперь я отлаживаю его на локальной машине с CF 11. Я не знаю, был ли обновлен код, когда CF 7 был заменен на CF 8, а затем с CF 9. CFquery, который, кажется, генерирует вышеуказанный SQL в профилировщике, выглядит следующим образом. Кроме того, таблица ProductItems имеет столбец идентификаторов, база данных не использует триггеры, а теги CFquery не используют атрибут результата:

<cfquery name="addProductItems" datasource="#dtsource#">
  insert into Productitems (item_date,item_description,item_type)  
  values (
    <cfqueryPARAM value = "#item_dat#" CFSQLType = "CF_SQL_TIMESTAMP" null="#item_dat eq '-1'#">,
    <cfqueryPARAM value = "#item_description#" CFSQLType = "CF_SQL_VARCHAR">,
    <cfqueryPARAM value = "#item_type#" CFSQLType = "CF_SQL_INTEGER">
    )
</cfquery>

1 ответ

Решение

Я думаю, что сервер CF добавляет его автоматически. Я знаю, что вы сказали, что используете MX7, но... в ColdFusion 8 была представлена ​​новая функция, которая извлекает сгенерированные идентификаторы из простого INSERT заявления. В SQL Server это было сделано путем добавления SELECT SCOPE_IDENTITY() к INSERT запрос. Это определенно вызвало несколько проблем в то время. Для более подробной информации смотрите:

NB: реализация могла измениться в более поздних версиях.

Как упомянуто в комментариях beloitdavisja, ищите cfquery теги, имеющие result приписывать. Result является структурой, содержащей сведения о выполненном запросе В CF8 сгенерированный идентификатор записи возвращается под ключом IDENTITYCOL, В более поздних версиях он также содержит независимую от базы данных версию, GENERATEDKEY,

Другие вопросы по тегам