Конкатенация строки postgres coldfusion внутри тега cfquery

<cfquery name="LOCAL.qrySelEvents" datasource="#variables.datasourceSettings.getDatasourceName()#" result="LOCAL.qryData" >
    SELECT evt_id, 
           acnt_dba_name,
           form_id,
           '#application.portals.data[request.applicationName].profileRootPath#form/index.cfm' 
               || CHAR(63) 
               || 'PKformID= ' 
               || #preserveSingleQuotes(LOCAL.formIdSql)# AS primaryFormURL,
    FROM    events
</cfquery>

Мне нужно объединить #application.portals.data[request.applicationName].profileRootPath#form/index.cfm с char(32) и PKformID= ' || #preserveSingleQuotes(LOCAL.formIdSql)#. Я использовал оператор || postgres. Но это дает мне ошибку:

ОШИБКА: синтаксическая ошибка рядом с "||"

Не могли бы вы помочь мне в этом?


person Satish Sharma    schedule 07.01.2013    source источник
comment
Я очень новичок в холодном синтезе, пожалуйста, помогите мне в этом.   -  person Satish Sharma    schedule 07.01.2013
comment
Кроме того, preserveSingleQuotes обычно избегают, потому что он открывает базу данных для внедрения sql, если ввод не был должным образом очищен.   -  person Leigh    schedule 07.01.2013


Ответы (3)


Последняя строка вашего предложения select имеет запятую в конце.

person Dan Bracuk    schedule 07.01.2013

ОК, а также сообщение об ошибке, если у вас включен ROBUST EXCEPTION HANDLING (это в CFAdmin), вы должны вернуть SQL, который CF передавал на сервер. Это должно показать вам, где синтаксическая ошибка находится в вашем SQL. Вы также должны всегда публиковать эту информацию в своем вопросе, поэтому, даже если вы не видите проблему, кто-то другой может ее увидеть.

Теперь я подозреваю, потому что это:

#preserveSingleQuotes(LOCAL.formIdSql)#

необходимо рассматривать как строку (что и есть), и в этом случае вам нужно будет заключить ее в кавычки, чтобы БД увидела ее как строку. IE:

'#preserveSingleQuotes(LOCAL.formIdSql)#'

Учитывая, что в этом значении нет ссылок, ориентированных на БД:

`'#application.portals.data[request.applicationName].profileRootPath#form/index.cfm' || CHAR(63) || 'PKformID= ' || '#preserveSingleQuotes(LOCAL.formIdSql)#'`

Я спрашиваю, почему вам нужно включить его в свой запрос SELECT. По сути, вы просто передаете значение SQL-серверу, а затем просто возвращаете его обратно. Так что подозреваю, что здесь что-то не так. Что вы на самом деле пытаетесь здесь сделать?

person Adam Cameron    schedule 07.01.2013

Я, наконец, получил ответ на этот вопрос, CHAR (63) создает проблему в этом, поскольку в Sql-сервере CHAR - это функция, которая дает символ из ASCII, а в postgresql функция CHR () доступна для того, чтобы дать символ из ASCII. Итак, новый запрос:

<cfquery name="LOCAL.qrySelEvents" datasource="#variables.datasourceSettings.getDatasourceName()#" result="LOCAL.qryData" >
    SELECT evt_id, 
           acnt_dba_name,
           form_id,
           '#application.portals.data[request.applicationName].profileRootPath#form/index.cfm' 
               || CHR(63) 
               || 'PKformID= ' 
               || #preserveSingleQuotes(LOCAL.formIdSql)# AS primaryFormURL
    FROM    events
</cfquery>

Спасибо за вашу поддержку.

person Satish Sharma    schedule 09.01.2013