当前位置: 代码迷 >> Sql Server >> [怎樣處理]SQL2008、SQL2005類型判斷出錯解决方法
  详细解决方案

[怎樣處理]SQL2008、SQL2005類型判斷出錯解决方法

热度:511   发布时间:2016-04-27 17:05:49.0
[怎樣處理]SQL2008、SQL2005類型判斷出錯
SQL code
use Tempdbgo--在SQL2005和SQL2008時,都會出現set nocount on ;if object_id('Tempdb..#A') is not null    drop table #Acreate table #A(    A_ID int  not null ,    Type nvarchar(20))if object_id('Tempdb..#B') is not null    drop table #Bcreate 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           A2           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,行 28Error converting data type nvarchar to bigint.*/insert #B select 1,10,0--新增一條后,影響引擎類型判斷以下不會錯goselect     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_Idgo--新增20條數據,數據量記錄數對類型判斷有影響.declare @i intset @i=0while @i<10begin    insert #B select 3,'Error'+rtrim(@i),2--類型非字符    set @[email protected]+1endgo--force order用提示強制執行順序select     cast(b.value as int) as [轉換后正常]from     #A aCross Apply    (select top 1 Value from #B where A_ID=a.A_ID order by Num asc)boption(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
------解决方案--------------------
学习
  相关解决方案