MS SQL问题 - 字段长度受限制

时间:2008-12-04 11:42:16

标签: sql-server triggers

我有一个带有各种表的MS SQL DB,特别是一个字段让我感到悲伤。

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

如果我尝试将超过60个字符的任何字符串放入字段中,我会得到一个例外, “字符串或二进制数据将被截断”。虽然字符串比显式设置的数据类型短,但它仍然会引发异常。

是否有数据库设置可以执行此操作?什么可能导致显式设置的数据类型被覆盖?

修改:
触发器不会复制值或将其插入另一个表中,也不会使用这些数据。 - (不正确)

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

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

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

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

没有涉及填充。

答案:

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

也许您需要NVARCHAR(100)或NVARCHAR(60)。

NVARCHAR中的单个字符是VARCHAR的两倍。如果输入数据是unicode

,则使用NVARCHAR

修改

基于您的评论,看起来使用nvarchar并不是解决问题的必要方法,而且很难猜出到目前为止提供的信息存在哪些问题:

您可以使用约束和触发器编写表格脚本并发布代码,这肯定有助于找到问题的根源。

答案 1 :(得分:1)

元数据函数COL_LENGTH所说的是该列的已定义大小?

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

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

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

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

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