1

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

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

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

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

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

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

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

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

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

不涉及填充。

回答:

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

感谢所有的帮助。

4

2 回答 2

2

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

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

编辑:

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

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

于 2008-12-04T11:47:12.323 回答
1

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

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

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

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

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

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

于 2008-12-04T13:10:47.770 回答