创建视图时cfquery出现奇怪错误

时间:2011-12-27 18:40:14

标签: sql coldfusion coldfusion-9

我有以下查询返回错误:“关键字'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

1 个答案:

答案 0 :(得分:7)

我针对自己的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参考,请随时使用链接编辑此答案。

我还要注意,根据ID的值,您可以考虑用括号包装视图名称。如果ID以数字开头,则语句将按原样失败,但将其放入括号中的语句将涵盖这些情况(只需确保在查询视图时也使用括号表示法)。示例:create view [#id#_view]