如何在使用ValueList生成的cfparam VARCHAR列表中转义逗号?

Dan*_*del 2 coldfusion cfquery cfqueryparam coldfusion-8

假设有一个SQL表 Fruit

id | name
--- ------
 1 | 'apples'
 2 | 'pears'
 3 | 'kiwi'
 4 | 'bananas, peaches and plumbs'
Run Code Online (Sandbox Code Playgroud)

鉴于以下查询

<cfquery name="qAllFruit" datasource="#DSN#">
    SELECT name FROM Fruit
</cfquery>
<cfquery name="qLeftoverFruit" datasource="#DSN#">
    SELECT name FROM Fruit
     WHERE name NOT IN (<cfqueryparam CF_SQL_TYPE="CF_SQL_VARCHAR" 
                                      value="#ValueList(qAllFruit.name)#" 
                                      list="yes" />)
</cfquery>
Run Code Online (Sandbox Code Playgroud)

然后qLeftoverFruit将错误地返回1行:bananas, peaches and plumbs因为扩展cfqueryparam列表被错误地解释:

WHERE name NOT IN ('apples','pears','kiwi','bananas','peaches and plumbs')
Run Code Online (Sandbox Code Playgroud)

有没有办法在仍然使用cfqueryparam标签时纠正这个问题ValueList

更新以下是您可以用来重现此问题的要点:http://gist.github.com/a642878c96b82b21b52c

San*_*eev 5

@Daniel Mendel,我认为问题在于ColdFusion使用的默认分隔符.您的数据中包含','并且CF中的默认分隔符为','顺便提一下.

像这样更改您的查询 -

WHERE name NOT IN ( <cfqueryparam CFSQLType="CF_SQL_VARCHAR" 
                       value="#ValueList(qTags.tag,';' )#" 
                       list="Yes" separator=";" />
                  )
Run Code Online (Sandbox Code Playgroud)

只需将valueList中的分隔符更改为";" 从默认','并将QueryParam分隔符设置为';'.

  • @PeterBoughton:我使用chr(31)作为这个 - 单位分隔符 - 因为它是最接近你想要的意图,而不是挑选一些"不太可能"的角色并希望最好.我认为这比使用像chr(65536)这样的东西更好,因为它不需要发明一个特殊的"规则",即该角色具有特殊含义. (3认同)
  • 可以使用`Chr(65536)`作为分隔符,几乎肯定不会出现在常规文本中.(遗憾的是你不能直接传递一个数组.) (2认同)