2017-07-13 91 views
-2

我想在SQL服务器中联合29非常大的表,我得到的错误消息“将转换varchar值'10 -p4'转换为数据类型int时转换失败。我不能找到所有表中的所有列,我也找不到关于'10 -p4'的含义的信息。我怎样才能让我的工会工作?工会转换数据类型错误

+0

[SQL Union导致“将varchar值转换为int时转换失败”的可能的重复](https://stackoverflow.com/questions/25373180/sql-union-causes-conversion-failed-when-converting-the-varchar -value-to-int) –

回答

1

要使工会工作,所有列必须是相同的数据类型..

这将失败

select 1,'a' 
union 
select 'b','c' 

这将如果哟工作妳版本> = 2012

select 1,'a' 
union 
select try_Cast('b' as int),'c' 

所以尽量使用try_Cast如果你是在一个版本> = 2012列引发错误

的版本> = 2008和< 2012,你也可以尝试SQL_VARIANT,因为它封装了所有数据类型

select cast(1 as sql_variant),'a' 
union 
select cast('b' as sql_variant) ,'c' 

,你也可以尝试消除错误的值,如果你相信你只有通过整数where子句中使用ISNUMERIC,但这是受到一些限制

+1

不知道'sql_variant' +1 .. –

0

请看下面的例子

select 1 
union 
select '10-p4' 

当你执行上面的查询,你会得到同样的错误。一列可以只有一个datatype。您不能合并IntVarchar。如果这样做,编译器将隐式转换varcharint数据类型,因为INT拥有varchar

在给定的信息更高的优先级这一切,我可以与川方,找出哪些列有'10-p4'数据和做的INT一个显式转换到Varchar避免隐式转换

select cast(1 as varchar(10)) 
union 
select '10-p4' 
0

你很可能试图利用工会的表使用不同的数据类型组合。一个表在某处包含值'10 -p4',但另一个表中有一个同名的列被声明为int。

0

29个表的联合?哎呀 - 表演一定要吸!最好在查询开始时使用正确的模式创建一个临时表,然后在29个后续插入中插入记录,然后选择返回的内容。

旁白被更好的性能(SQL不具有比较29分的结果集,看它是否能找到一个共同的模式)它也更容易调试SQL

这里有一个例子:

-- Ensure that the temp table does not already exist 
-- (irrelevant if you wrap this in a stored proc) 
if (object_id('tempdb..#tempTable') is not null) 
    drop table #tempTable 

-- Create a table in the tempdb to compile your results in 
create table #tempTable 
(
    SourceQuery int, 
    Foo varchar(100), 
    Bar int 
) 

-- Fill the temp table 
insert into #tempTable 
select 1, foo, bar 
from TableA 

insert into #tempTable 
select 2, hellp, world 
from TableB 

-- 27 more queries like this 

-- Get your results 
select * from #tempTable 

-- Tidy Up 
drop table #tempTable