日期:2014-05-18  浏览次数:20463 次

[怎樣處理]SQL2008、SQL2005類型判斷出錯
SQL code
use Tempdb
go
--在SQL2005和SQL2008時,都會出現

set nocount on ;
if object_id('Tempdb..#A') is not null
    drop table #A

create table #A
(
    A_ID int  not null ,
    Type nvarchar(20)
)

if object_id('Tempdb..#B') is not null
    drop table #B

create table #B
(
    A_ID int not null,
    Value nvarchar(4000),
    Num int--無意義列
)
insert #A select 1,N'A'
insert #A select 2,N'A'

insert #B select 3,'Error',0--類型非字符

/*
#A:
A_ID        Type
----------- --------------------
1           A
2           A

#B:
A_ID        Value                Num
----------- -------------------- -----------
3           Error                0
*/

--轉換后出錯時出錯,不成立沒結果集
select 
    cast(b.value as bigint) as [轉換后出錯]
from #A a 
    inner join #B b on a.A_Id=b.A_Id


/*
訊息 8114,層級 16,狀態 5,行 28
Error converting data type nvarchar to bigint.

*/

insert #B select 1,10,0--新增一條后,影響引擎類型判斷以下不會錯
go
select 
    cast(b.value as bigint) as [轉換后出錯]
from #A a 
    inner join #B b on a.A_Id=b.A_Id



--怎樣處理方法1(用表提示處理,改變數據庫引擎的執行順序)
--LOOP | HASH | MERGE | REMOTE 

delete #B where isnumeric(Value)=1--刪除新增記錄


select 
    cast(b.value as int) as [轉換后正常]
from #A a 
    inner HASH join #B b on a.A_Id=b.A_Id


go


--新增20條數據,數據量記錄數對類型判斷有影響.

declare @i int
set @i=0
while @i<10
begin
    insert #B select 3,'Error'+rtrim(@i),2--類型非字符
    set @i=@i+1
end


go
--force order用提示強制執行順序

select 
    cast(b.value as int) as [轉換后正常]
from 
    #A a
Cross Apply
    (select top 1 Value from #B where A_ID=a.A_ID order by Num asc)b
option(force order)


drop table #a,#b



http://hi.csdn.net/link.php?url=http://blog.csdn.net%2Froy_88%2Farchive%2F2010%2F01%2F04%2F5128737.aspx

------解决方案--------------------
学习
------解决方案--------------------
學習~~
------解决方案--------------------

------解决方案--------------------
~
------解决方案--------------------
学习.
------解决方案--------------------
.
------解决方案--------------------
学习
------解决方案--------------------
学习
------解决方案--------------------
学习
------解决方案--------------------
学习,不过大版是不是考虑加分呢?
------解决方案--------------------
没看懂
------解决方案--------------------
UP
------解决方案--------------------
.
------解决方案--------------------
学习
------解决方案--------------------
又是sql所谓的优化引起的问题么?
学习。。。
------解决方案--------------------
cast(t.MyVal as decimal(16,2))

运算即可以放在join之前,也可以放在join之後,这个优化器说了算,总之我是不会写类似没有保障的语句~:)

PS:这样给一个固定的逻辑不就可以了吗? 

select 
cast(b.value as bigint) as [正常轉換]
from #A a 
inner join 
(
SELECT * FROM #B
WHERE ISNUMERIC(value)=1

) b on a.A_Id=b.A_Id
------解决方案--------------------
学习