Нечетная ошибка в cfquery при создании представления - PullRequest
1 голос
/ 27 декабря 2011

У меня есть следующий запрос, который возвращает ошибку: «Неверный синтаксис рядом с ключевым словом VIEW». Я пытался найти любую ссылку на этот экземпляр в Интернете и в SO. Если бы я пропустил решение или у кого-то есть какие-либо предложения, я был бы очень признателен.

Запрос:

    <cfquery datasource="#mydatasource#">
    CREATE VIEW #arguments.bulkRow.request_by#_uploader_features_view
    (
        feature_products_id
        , feature_text
        , feature_priority
    )
    AS
    SELECT
        a1.tbl_products__products_id AS feature_products_id,
        a1.tbl_productfeature__feature_text__1 AS feature_text,
        1 AS feature_priority
    FROM bulk_product_upload a1
    WHERE processed = 0
        AND request_by = <cfqueryparam value="#arguments.bulkRow.request_by#" cfsqltype="cf_sql_varchar">
        AND LEN( a1.tbl_productfeature__feature_text__1 ) > 1

    UNION

    SELECT
        a1.tbl_products__products_id AS feature_products_id,
        a1.tbl_productfeature__feature_text__2 AS feature_text,
        2 AS feature_priority
    FROM bulk_product_upload a1
    WHERE processed = 0
        AND request_by = <cfqueryparam value="#arguments.bulkRow.request_by#" cfsqltype="cf_sql_varchar">
        AND LEN(a1.tbl_productfeature__feature_text__2) > 1   

    ...

    UNION

    SELECT
        a1.tbl_products__products_id AS feature_products_id,
        a1.tbl_productfeature__feature_text__20 AS feature_text,
        2 AS feature_priority
    FROM bulk_product_upload a1
    WHERE processed = 0
        AND request_by = <cfqueryparam value="#arguments.bulkRow.request_by#" cfsqltype="cf_sql_varchar">
        AND LEN(a1.tbl_productfeature__feature_text__20) > 1
</cfquery>

Это сокращенная форма запроса, но она должна помочь вам начать и показать базовый макет.

Заранее спасибо,

JP * * +1010

1 Ответ

7 голосов
/ 27 декабря 2011

Я провел некоторое тестирование на своем собственном SQL Server, и кажется, что параметризованные запросы вызывают проблемы при создании представлений. Удаление тегов CFQUERYPARAM должно исправить проблему. Лучше всего использовать CFQUERYPARAM со стандартным оператором select, но в этом случае вы передаете SQL, который будет выполняться при каждом обращении к представлению, поэтому параметризация не может быть передана в представление.

Вот пара примеров, использующих ту же концепцию, но таблицы из одной из моих собственных баз данных.

Следующее выдает ошибку Incorrect syntax near the keyword 'view':

<cfset id="x" />
<cfquery>
    create view #id#_view as
    select * from AdminUser
    where admID = <cfqueryparam cfsqltype="cf_sql_varchar" value="#id#" />
</cfquery>

Отлично работает следующее:

<cfset id="y" />
<cfquery>
    create view #id#_view as
    select * from AdminUser
    where admID = '#id#'
</cfquery>

Если кто-то может найти ссылку на SQL Server, которая подробно объясняет это, не стесняйтесь редактировать этот ответ со ссылкой.

Я также хотел бы отметить, что в зависимости от значения идентификатора вы можете заключить имя представления в квадратные скобки. Если идентификатор начинается с цифры, оператор не будет работать как есть, но включение этого в оператор в скобках будет охватывать эти ситуации (просто обязательно используйте обозначение в скобках при запросе представления). Пример: create view [#id#_view]

...