6

Я использую профилировщик SQL Server 2008 R2 для отладки проблемы в приложении 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():Профилировщик SQL Server, показывающий SCOPE_IDENTITY(), в то время как код ColdFusion не использует его ни в одном запросе

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 

UPDATE Хотя изначально приложение было разработано в 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> 
+0

Каков фактический CF-код для INSERT выше? – Leigh

ответ

7

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

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

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

+4

Это было мое предположение. @nam - найдите теги 'cfquery', которые имеют атрибут' result'. Этот результат имеет ключ 'GENERATEDKEY', который CF сохраняет вставленный идентификатор – beloitdavisja

+2

@beloitdavisja - Yep. Хотя, IIRC, db-агностик 'GENERATEDKEY' не существовал в CF8. Он был добавлен позже. CF8, поддерживается только 'GENERATED_KEY' для MySQL db's (@nam - обратите внимание на подчеркивание). – Leigh

+2

Не забывайте, что также стоит проверить, что у вас нет триггеров, определенных в базе данных, поскольку они могут выполнять SQL, который вы не увидите в поиске кода CF. Однако, как и выше, вызов хранимой процедуры выглядит очень похож на подготовленный оператор, который вы ожидаете, что драйвер БД выдает для cfquery, когда cfqueryparam был использован, и SCOPE_IDENTITY() будет ожидаться в CF8, когда результат cfquery атрибут указан. Просто странно видеть, что если вы действительно все еще на CF7. –