【问题标题】:MS SQL Problem - Field length being limitedMS SQL 问题 - 字段长度受到限制
【发布时间】:2008-12-04 11:42:15
【问题描述】:

我有一个包含各种表的 MS SQL 数据库,特别是一个字段让我很伤心。

数据类型设置为 varchar(100),但字段限制为 60 个字符。

如果我尝试将任何超过 60 个字符的字符串放入字段中,则会出现异常, “字符串或二进制数据将被截断”。虽然字符串比显式设置的数据类型短,但还是会抛出异常。

可能有一个数据库设置可以做到这一点吗?什么可能导致显式设置的数据类型被覆盖?

编辑:
触发器不会复制值或将其插入到另一个表中,它们也不使用数据。 -(不正确)

小于 60 个字符的字符串可以正常工作。

所有具有 varchar(100) 的列都会出现相同的问题,但所有其他列都接受正确的值。 varchar(10) 列工作正常。

如果我尝试使用长度超过 60 个字符的字符串更新字段,则此表中的任何行都会引发异常。

我正在尝试使用 SQL Server Management Studio 将数据直接插入到字段中。

不涉及填充。

答案:

第二个表的列设置为 60。更新触发器称为存储过程,将数据插入“非规范化”表中。

感谢大家的帮助。

【问题讨论】:

    标签: sql-server triggers


    【解决方案1】:

    也许您需要 NVARCHAR(100) 或更确切地说是 NVARCHAR(60)。

    NVARCHAR 中的单个字符是 VARCHAR 大小的两倍。如果您的输入数据是 unicode,您将使用 NVARCHAR

    编辑:

    根据您的 cmets,使用 nvarchar 似乎不是问题的解决方案,而且很难用目前提供的信息猜测问题是什么:

    您能否编写包含约束和触发器的表格并发布代码,这肯定有助于找到问题的根源。

    【讨论】:

      【解决方案2】:

      元数据函数 COL_LENGTH 表示该列的定义大小是多少?

      您对该列有任何默认长度限制吗?

      从前面的答案中假设这不是触发器问题或 nvarchar 问题,并且您认为截断的长度为 60,那么用长度为 60 和 61 的 SUBSTRING 更新该单列有什么作用?这可能会验证或使您的理论无效。

      或者,数据库排序规则和/或编码设置可能在插入原始数据后发生了变化。这可能会导致一些特殊性。你说这是原始数据库的副本。它是否位于不同的 SQL Server 实例上?如果是这样,两个 SQL Server 实例是否具有相同的排序规则和编码设置?

      编辑:不推荐使用您所讨论的ANSI_PADDING setting,并且该设置将在 SQL Server 的未来版本中永久启用。但是您正在查看的事实表明您尝试插入的值以某种方式被填充,可能带有尾随空格。但是,这与您的 SUBSTRING 实验结果不一致,该结果显示 60 个字符的截止值。所以我不确定这个设置是否相关,特别是因为它对于 nvarchar 列始终为 ON。

      任何 61 个字符的字符串会导致更新异常吗?此外,虽然您检查了立即表触发器,但是否有任何级联(间接)触发器可能导致此异常?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-06
        • 1970-01-01
        • 2021-02-24
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        相关资源
        最近更新 更多