1

编辑:在您决定阅读并尝试理解下面的文字之前,请先阅读下面的答案。当您看到发生的事情时,您可能会觉得不值得;)

我有一个奇怪的问题:SQL Server 2008 R2 一直抱怨一个无效的列确实不再存在,但我也没有使用它!

我无法再从我自己的应用程序中更新该表中的任何行,在该应用程序中找不到对该列的引用,因为我现在总是收到此错误。然后我想直接在 SSMS 中更新作为测试,但是当我在那里编辑行时,我仍然收到此错误。

之前发生的事情:我创建了一个名为 CertcUL varchar(1) 的列,并且成功了。过了一会儿,我似乎需要它成为一个 varchar(30),所以我编辑了表格设计并将它变成了一个 varchar(30)。

从那一刻起,我看到我只能在存储 1 个字符时更新此列。当我尝试存储更多内容时,我收到一个关于字符串或二进制截断的错误警告。所以不知何故,以前的 varchar(1) 信息仍然存在于数据库中。

当我将该列重命名为 CertcUL2 或 Cert_cUL 时,同样的事情不断发生!因此更改列名不会改变根本原因。此外,当只是尝试直接在 SSMS 中添加一些字符时。

当我删除该列并立即使用 varchar(30) 添加一个新列并调用“test”时,同样的问题仍然存在!此列仍然只允许我存储一个字符!该列是最后一列。使它成为最后一列也无济于事。只有在保留另一列的同时创建新列时,我才能拥有行为正常的列。

所以不知何故,SQL Server 会保存一些关于列的元数据,即使它已被删除。并且不看名称,而是看列的创建顺序。

有谁知道这是怎么发生的,除了(可能)删除和重新创建整个表之外,我还能如何解决这个问题?

谢谢!

4

1 回答 1

2

哦,我的上帝,我觉得自己太愚蠢了……这是一个仍然包含此列的触发器。我只是注意到它,因为在尝试使用更新语句进行更新时。只有这样我才能收到正确的错误消息,所以我现在知道发生了什么。太愚蠢了,我没有检查触发器!对于那个很抱歉!

更多信息:我在这个表 A 上有一个更新触发器,它将所有当前值复制到包含相同列的历史表 B。所以我确实更改了表 A 中 CertcUL 列的长度,但忘记了表 B。所以每次都弹出旧的列名,并且看到它符合字符串截断的要求,而我在表 A 中的列似乎很混乱正好。

再次抱歉 :)

于 2013-02-15T09:25:24.320 回答