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)
如果失败则失败的列在另一半.我们继续这个过程,直到找到讨厌的专栏.
还有什么比这更优雅的?
注意:我也发现了这个问题的近乎重复,但它几乎没有答案.
以下脚本将为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)