Правильный способ передачи функции SQL в качестве значения

Я хочу обновлять поле DateUpdated записи каждый раз, когда пользователь обновляет запись.

Я думал, что должен сделать это так:

<cfquery>
UPDATE
dbo.MyTable
SET DateUpdated = <cfqueryparam value="GetDate()" />
</cfquery>

Я не знаю, правильно ли это. Для функции нет значения атрибута cfsqltype. В таком случае, я просто делаю это

<cfquery>
    UPDATE
    dbo.MyTable
    SET DateUpdated = GetDate()
</cfquery>

person volume one    schedule 14.02.2015    source источник
comment
Это обновит каждую строку в таблице, кстати   -  person James A Mohler    schedule 15.02.2015
comment
@JamesAMohler, вы правы, это просто пример кода   -  person volume one    schedule 15.02.2015
comment
Вы путаете функции CF и базы данных. Выражения в cfqueryparam оцениваются сервером CF сначала. Затем CF отправляет оцененную строку SQL в вашу базу данных для обработки. Поскольку getDate() является функцией SQL Server, CF ничего о ней не знает. Это означает, что вы не можете использовать его внутри cfqueryparam. Вы можете использовать только функции CF, такие как now() (продолжение)   -  person Leigh    schedule 15.02.2015
comment
Использование функции не имеет значения. cfsqltype применяется к одному значению, возвращенному функцией. Если функция возвращает объект datetime (например, now()), вы используете cf_sql_timestamp (дата и время) ИЛИ cf_sql_date (только дата) в зависимости от того, хотите ли вы включить часть времени. Однако, как указал Карл, если вместо этого вы также можете использовать функцию базы данных getDate(). В этом случае вам вообще не нужен cfqueryparam.   -  person Leigh    schedule 15.02.2015
comment
RE: Правильный способ передачи функции SQL в качестве значения Чтобы уточнить и ответить на ваш вопрос, функция базы данных не является значением . Это команда sql, которая должна быть оценена вашей базой данных. Обертывание в cfqueryparam предотвращает это. Итак, ответ таков: не используйте cfqueryparam для функций базы данных. Ваш второй пример - правильный синтаксис.   -  person Leigh    schedule 15.02.2015


Ответы (1)


Первый не будет работать, потому что вы параметризовали имя функции SQL, поэтому она будет передавать "GetDate()" как литеральную строку. Однако, если вы заменили «GetDate()» на «#Now()#», это должно сработать, так как вы передаете значение из функции ColdFusion.

Хотя второй должен работать как есть.

person Carl Von Stetten    schedule 14.02.2015
comment
Я пытался использовать Now(), но он не указывает время. Но собственный SQL GetDate() делает - person volume one; 15.02.2015
comment
Да, это так. Смотрите мои комментарии выше. - person Leigh; 15.02.2015
comment
Правильно понял. Я использовал Now() с cf_sql_date и, следовательно, временная часть никогда не записывалась! - person volume one; 15.02.2015