如何确定哪一列在插入时引发算术溢出错误?

Den*_*eev 7 t-sql sql-server sql-server-2005 sql-server-2008

想象一下,里面有一百个不同的列.想象一下,我有一个用户数据表,我希望将数据复制到基表.所以我写了这个简单的insert-select语句,弹出这个错误.那么,找出哪一列引起错误的最优雅的方法是什么?

我对解决方案的初步想法是将它包装在一个事务中,我将最终回滚并使用一种Divide and Conquer方法:

begin tran

insert into BaseTable (c1,c2,c3,...,cN)
select c1,c2,c3,...,cN 
from UserTable

rollback tran
Run Code Online (Sandbox Code Playgroud)

而这显然失败了.所以我们将列集分成两半,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

如果失败则失败的列在另一半.我们继续这个过程,直到找到讨厌的专栏.

还有什么比这更优雅的?

注意:我也发现了这个问题的近乎重复,但它几乎没有答案.

Lie*_*ers 6

以下脚本将为SELECT每个整数列创建语句Basetable.
执行结果SELECT语句应该精确定位您的违规列Usertable.

SELECT  'PRINT ''' 
        + sc.Name 
        + '''; SELECT MIN(CAST(' 
        + sc.Name 
        + ' AS INTEGER)) FROM Usertable'
FROM    sys.columns sc 
        INNER JOIN sys.types st ON st.system_type_id = sc.system_type_id
WHERE   OBJECT_NAME(Object_ID) = 'BaseTable'
        AND st.name = 'INT'
Run Code Online (Sandbox Code Playgroud)