【问题标题】:Appending data to database column using coldfusion使用冷融合将数据附加到数据库列
【发布时间】:2015-03-02 10:09:37
【问题描述】:

由于某种原因,以下更新不会将我的注释添加到 Admin_Notes 字段。该字段为空,但一旦有数据,我想添加到当前数据而不是替换它。

<cfargument name="adminNotes" required="yes">
<cfargument name="form_ID" required="yes">
<cfargument name="quoteNumber" required="yes">

<cfquery name="completeRFQ" datasource="RC">
    UPDATE RFQ_Forms
    SET Status = 'Complete',
        Completion_Date = CURRENT_TIMESTAMP,
        Admin_Notes = Admin_Notes + <cfqueryparam value="#ARGUMENTS.adminNotes#">,
        Quote_Num = <cfqueryparam value="#ARGUMENTS.quoteNumber#">
  WHERE ID = <cfqueryparam value="#ARGUMENTS.form_ID#">
</cfquery>

此列设置为 nvarchar(MAX)

我的查询的其余部分正确完成,并且我验证了正在传递的变量中有一个字符串。

我将查询包装在 cftry 中,但没有得到任何回复。

测试后我的问题有更新

该列实际上是空的,因为这是我第一次运行它。当我手动将文本添加到列中然后运行查询时,文本的第二部分将添加到列中。

如果该列为空且已包含文本,我如何向该列添加数据?

【问题讨论】:

标签: sql-server coldfusion sql-update


【解决方案1】:

您应该能够围绕您的列包装一个 isNull() 检查。这样,如果Admin_Notes 为空,它会将其转换为空字符串并附加您的数据

<cfquery name="completeRFQ" datasource="RC">
UPDATE RFQ_Forms
SET Status = 'Complete',
    Completion_Date = CURRENT_TIMESTAMP,
    Admin_Notes = isNull(Admin_Notes,'') + <cfqueryparam value="#ARGUMENTS.adminNotes#">,
    Quote_Num = <cfqueryparam value="#ARGUMENTS.quoteNumber#">
WHERE ID = <cfqueryparam value="#ARGUMENTS.form_ID#">
</cfquery>

【讨论】:

  • 包含 cfsqltype 很重要。对于 CF10+,请参阅 cf_sql_nvarchar / cf_sql_longnvarchar。省略 sql 类型可能会导致 unicode 文本乱码depending on your settings
  • 感谢您的帮助和您提供的信息。 +1 选中
  • 其实我收回了“可以”。上面使用默认的 CF10 设置肯定会混淆 unicode 文本。 cfsqltype 重要的人;-)
【解决方案2】:

该列实际上是空的,因为这是我第一次运行它。当我手动将文本添加到列中然后运行查询时,文本的第二部分将添加到列中。

它失败的原因是你试图将某些东西连接为空。要解决此问题,请更新您的表并将所有空值设置为空字符串。然后使用空字符串的默认值更改该列以使其不为空。

与您的问题无关,您应该为您的 cfargument 和 cfqueryparam 标签指定数据类型。

【讨论】:

  • 从技术上讲,不允许空值不是必需的。只有在适合您的应用程序时才这样做。 与您的问题无关,您应该指定数据类型实际上这非常相关。如果您省略类型,则默认为 CHAR,这可能会导致 unicode 值被截断和/或乱码,具体取决于您的版本和设置。对于 CF10+,您应该使用CF_SQL_NVARCHAR
  • ... 或 CF_SQL_LONGNVARCHAR 表示最大列数。
  • 允许空值意味着您必须按照 Matt 的选项运行 isnull 函数。如果您要这样做,那么使用默认值是没有意义的。我推荐这种方法的原因是 isnull 函数增加了每个查询的执行时间。
  • 单个记录的任何差异都可以忽略不计。您可能正在考虑在 WHERE 子句中使用函数。这可以对查询性能产生显着影响,因为它阻碍了索引的使用。至于默认值,NULL 和空字符串之间是有区别的。使用哪个默认值取决于应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 2012-02-14
相关资源
最近更新 更多