【问题标题】:'String or binary data would be truncated' fix isn't working. What am I doing wrong?“字符串或二进制数据将被截断”修复不起作用。我究竟做错了什么?
【发布时间】:2016-09-14 22:10:14
【问题描述】:

所以这是一个在这里被多次问过的老问题,但显而易见的解决方案对我不起作用。我有一个查询:

INSERT Table1
(
    schoolName
)
VALUES
(
    <cfqueryparam value="#schoolName#" cfsqltype="CF_SQL_VARCHAR" maxlength="50">
)

运行此查询时,我收到了此处报告了数十次的“字符串或二进制数据将被截断”错误。我查看了我的表的“设计”选项,schoolName 的最大长度为 20,而我尝试插入的值的长度为 22。所以我认为这是一个简单的修复,我只是运行:

ALTER TABLE Table1
ALTER COLUMN schoolName VARCHAR(50)

但是我再次运行了这个查询,得到了同样的错误!还有什么我需要做的或者我错过了什么愚蠢的事情吗?会不会是缓存问题?据我所知,错误是说我正在尝试插入长度大于设置允许的列的字符串,因此(众多)解决方案之一是扩展最大列长度。

【问题讨论】:

  • cfqueryparam 标签是 ColdFusion 绑定变量和保护数据库免受 SQL 注入的方式。所以标签被正确使用,变量“schoolName”的值被插入到表中。
  • 不使用 ColdFusion 尝试时会发生什么?
  • 是的,这是一个冷融合问题而不是 Sql 问题。 (基本上是丹的观点)。对表名执行 sp_help 以确认您确实将长度更改为 50(确认更改已被接受)。还有一件事要确认。 Cold fusion 可能会在您进行更改之前查看表大小。它可能认为它仍然是旧的,我假设尺寸较小。您可能需要以某种方式循环您的冷融合服务器以再次查看数据库。
  • Cold Fusion服务器的回收如何?它可能会查看一次数据库,而不是每次执行 sql。因此它可能认为该表仍然具有旧的较小尺寸。
  • 每次我在这里发布冷融合问题时都会被问到这个问题 @ConorBaumgart - 如果你不是在开玩笑,我很确定 Dan 正在谈论基本的故障排除步骤;- ) 即通过暂时从混合物中移除 CF 来确认哪一方是问题所在。直接在 SQL Server 中执行相同的 SQL 是否有效?如果没有,你有你的答案。否则,问题出在CF方面。如果您已确认后者,那么就像 MT 所说,也许 CF 出于某种原因没有接收元数据更改。所以回收不是一个坏主意。

标签: sql sql-server coldfusion


【解决方案1】:

请注意,cfqueryparam 标记中的 maxlength 属性是一种验证,当字符串长度超过指定的最大值时,它甚至会在将查询发送到 SQL Server 之前简单地引发异常。

在您的情况下,它通过了,String or binary data would be truncated 消息是由 SQL Server 引起的错误。检查Table1 表中的schoolName 列是否已被您的更改正确更改。

附带说明,如果您对截断的数据感到满意,您可以随时使用:

<cfqueryparam value="#left(schoolName, 50)#" cfsqltype="CF_SQL_VARCHAR">

如果值超过 50 个字符,这会截断您的值而不会导致错误 - 除非您的表架构指定了更低的最大值。长度。在这种情况下,您仍然会看到相同的错误消息。

【讨论】:

  • 同意。这是一个 SQL Server 错误,所以要么 a) 表 更改或 b) CF 没有接受更改(不太可能,但可能)
【解决方案2】:

我觉得犯这个错误很愚蠢,但它确实发生了,所以我会在未来为任何人发布答案:

在我的 Table1 上设置了一个触发器,用于插入/更新 Table1Log 表。由于 Table1Log schoolName 列未与 Table1 schoolName 列一起更改,因此我遇到了与以前相同的错误。一旦我改变了这两件事的列,就开始正常工作了。

【讨论】:

    猜你喜欢
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多