2013-02-15 69 views
1

编辑:请先阅读我的答案,然后再决定阅读并尝试理解下面的文本。当你看到发生了什么时,你可能不会觉得它是值得的;)SQL Server无效列名称错误抱怨列已久

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

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

以前发生了什么:我创建了一个名为CertcUL varchar(1)的列,并且工作正常。过了一段时间后,我需要它是一个varchar(30),所以我编辑了表格设计并将它变成了一个varchar(30)。

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

当我将该列重命名为CertcUL2或Cert_cUL时,仍然发生同样的事情!所以改变列名不会改变根本原因。另外,当试图在SSMS中直接添加一些字符时。

当我删除列,并立即添加一个新的与varchar(30),并称为'测试',同样的问题仍然存在!本专栏仍然只允许我存储一个字符!该列是最后一列。使它成为最后一栏也没有帮助。只有在保留另一列的同时创建新列时,我才可以使列的行为正确。

因此,不管怎样,SQL Server都会保存一些有关列的元数据,即使它已被删除。并没有看名字,而是按照创建列的顺序。

有没有人有一个想法如何发生这种情况,除了(可能)删除和重新创建整个表,我怎么能解决这个问题?

谢谢!

回答

2

哦,我的上帝,我觉得这么愚蠢......这是一个触发器,仍然包含这个专栏。我只是注意到它,因为当试图用更新语句进行更新时。只有这样我才能得到一个恰当的错误信息,所以我现在知道发生了什么。太愚蠢了,我没有检查触发器!对于那个很抱歉!

更多信息:我在此表A上有一个更新触发器,它将所有当前值复制到包含相同列的历史记录表B中。所以我确实改变了表A中CertcUL列的长度,但忘记了表B的内容。因此,看到旧列名每次都弹出,并且看到它合并关于字符串截断的时候非常混乱,而表A中的列正好。

对不起:)