2017-07-13 88 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