我有一个带有各种表的MS SQL DB,特别是一个字段让我感到悲伤。
数据类型设置为varchar(100),但该字段限制为60个字符。
如果我尝试将超过60个字符的任何字符串放入字段中,我会得到一个例外, “字符串或二进制数据将被截断”。虽然字符串比显式设置的数据类型短,但它仍然会引发异常。
是否有数据库设置可以执行此操作?什么可能导致显式设置的数据类型被覆盖?
修改:
触发器不会复制值或将其插入另一个表中,也不会使用这些数据。 - (不正确)
小于60个字符的字符串工作正常。
具有varchar(100)的所有列都会出现同样的问题,但所有其他列都接受正确的值。 varchar(10)列工作正常。
如果我尝试使用长度超过60个字符的字符串更新字段,则此表中的任何行都会抛出异常。
我正在尝试使用SQL Server Management Studio将数据直接插入到字段中。
没有涉及填充。
答案:
有一个第二个表,其中列设置为60.更新触发器调用存储过程,将数据插入“非规范化”表。
感谢您的帮助。
答案 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个字符的字符串是否会导致更新异常?此外,虽然您已检查过立即表触发器,但是是否存在可能导致此异常的级联(间接)触发器?