【发布时间】:2010-09-08 11:20:28
【问题描述】:
想象一个包含一百个不同列的表格。那么,想象一下,我有一个用户数据表,我想将数据从该表复制到基表。所以我写了这个简单的插入选择语句,然后弹出这个错误。那么,找出哪一列引发错误的最优雅的方法是什么?
我对解决方案的最初想法是将其包装在一个事务中,我最终将回滚并使用一种分而治之的方法:
begin tran
insert into BaseTable (c1,c2,c3,...,cN)
select c1,c2,c3,...,cN
from UserTable
rollback tran
这显然失败了。所以我们将列集分成两半,如下所示:
begin tran
insert into BaseTable (c1,c2,c3,...,cK) --where K = N/2
select c1,c2,c3,...,cK --where K = N/2
from UserTable
rollback tran
如果它失败了,那么失败的列就在另一半。然后我们继续这个过程,直到找到讨厌的列。
还有什么比这更优雅的吗?
注意:我还发现了这个问题的近乎重复,但它几乎没有回答。
【问题讨论】:
-
如果您将 UserTable 的数据类型与 BaseTable 的数据类型匹配,那么您的插入应该没有任何问题。之后所需要做的就是找到有问题的 UserTable 列
. -
@Lieven 嗯,UserTable 就是这样......一个没有任何限制的用户表,因为其中的数据来自 Excel 或 Access 之类的。
-
我很同情。如果这是需要定期完成的事情,您不能创建一个脚本/存储过程来检查您的输入吗?宏和简单的选择会大有帮助,例如 'SELECT 'c1', CAST(c1) AS INTEGER FROM UserTable'。
-
这也适用于简单的
INSERT ... VALUES ...语句——在这种情况下更难解决。 I submitted a Connect item for the column name to be added to the error messages – 这真的会让这变得容易得多。
标签: sql-server sql-server-2005 tsql sql-server-2008