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
запрос. Это определенно вызвало несколько проблем в то время. Для более подробной информации смотрите:
- Проблемы с функцией сгенерированных ключей CF 8
- Две важные ошибки / проблемы CF8, детализированные вчера
NB: реализация могла измениться в более поздних версиях.
Как упомянуто в комментариях beloitdavisja, ищите cfquery
теги, имеющие result
приписывать. Result
является структурой, содержащей сведения о выполненном запросе В CF8 сгенерированный идентификатор записи возвращается под ключом IDENTITYCOL
, В более поздних версиях он также содержит независимую от базы данных версию, GENERATEDKEY
,