首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

2012-01-22 
[怎樣處理]SQL2008、SQL2005類型判斷出錯SQL codeuse Tempdbgo--在SQL2005和SQL2008時,都會出現set nocount

[怎樣處理]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 @i=@i+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
[解决办法]
学习


[解决办法]
学习学习
[解决办法]
学习
[解决办法]

探讨
引用:
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

拿以上例子測測你就會發現,不是條件位置可解決]
SQL08環境上測
SQL codeselectcast(t.MyValasdecimal(16,2))from #A across apply
(selecttop1 b.MyValfrom #B bwhere b.A_ID=a.AIDandISNUMERIC(b.MyVal)=1--加上你說的條件orderby b.Sortdesc
)twhere a.ItemType=0

[解决办法]
学习
[解决办法]
學習~
[解决办法]
学习啊
[解决办法]
探讨
引用:
引用:
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

拿以上例子測測你就會發現,不是條件位置可解決]
SQL08環境上測
SQL codeselectcast(t.MyValasdecimal(16,2))from #A across apply
(selecttop1 b.MyValfrom #B bwhere b.A_ID=a.AIDandISNUMERIC(b.MyVal)=1--加上你說的條件orderby b.Sortdesc
)twhere a.ItemType=0


这种情况又不一样了。sql一样可以先执行join再筛选isnumeric=1。

CREATE INDEX ix_t ON #B(sort)
GO

select
cast(t.MyVal as decimal(16,2))
from #A a
cross apply
(
select top 1 b.MyVal from
(
  SELECT * FROM #B WHERE ISNUMERIC(b.MyVal)=1
  )  b
where b.A_ID=a.AID and
order by b.Sort desc
)t
where a.ItemType=0

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


你的主题不是"怎样处理"类型判出错么?

其实我想说的是,为何使用Query hint去干涉SQL优化器的行为,直接给一个固定的语义给它不好吗?
[解决办法]
探讨
SQL codeuse Tempdbgo--在SQL2005和SQL2008時,都會出現set nocounton ;ifobject_id('Tempdb..#A')isnotnulldroptable #Acreatetable #A
(
A_IDintnotnull ,
Typenvarchar(20)
)ifobject_id('Tempdb..#B')isnotnulldroptable #Bcreatetable #B
(
A_IDintnotnull,
Valuenvarchar(4000),
Numint--無意義列)insert #Aselect1,N'A'insert #Aselect2,N'A'insert #Bselect3,'Error',0--類型非字符/*
#A:
A_ID Type
----------- --------------------
1 A
2 A

#B:
A_ID Value Num
----------- -------------------- -----------
3 Error 0*/--轉換后出錯時出錯,不成立沒結果集selectcast(b.valueasbigint)as[轉換后出錯]from #A ainnerjoin #B bon a.A_Id=b.A_Id/*
訊息 8114,層級 16,狀態 5,行 28
Error converting data type nvarchar to bigint.*/insert #Bselect1,10,0--新增一條后,影響引擎類型判斷以下不會錯goselectcast(b.valueasbigint)as[轉換后出錯]from #A ainnerjoin #B bon a.A_Id=b.A_Id--怎樣處理方法1(用表提示處理,改變數據庫引擎的執行順序)
--LOOP | HASH | MERGE | REMOTEdelete #Bwhereisnumeric(Value)=1--刪除新增記錄selectcast(b.valueasint)as[轉換后正常]from #A ainner HASHjoin #B bon a.A_Id=b.A_Idgo--新增20條數據,數據量記錄數對類型判斷有影響.declare@iintset@i=0while@i<10begininsert #Bselect3,'Error'+rtrim(@i),2--類型非字符set@i=@i+1endgo--force order用提示強制執行順序selectcast(b.valueasint)as[轉換后正常]from


#A aCross Apply
(selecttop1 Valuefrom #Bwhere A_ID=a.A_IDorderby Numasc)boption(forceorder)droptable #a,#b
http://hi.csdn.net/link.php?url=http://blog.csdn.net%2Froy_88%2Farchive%2F2010%2F01%2F04%2F5128737.aspx


[解决办法]
学习
[解决办法]
探讨
引用:
[怎樣處理]SQL2008、SQL2005類型判斷出錯


你的主题不是"怎样处理"类型判出错么?

其实我想说的是,为何使用Query hint去干涉SQL优化器的行为,直接给一个固定的语义给它不好吗?

這也是一种方法
我個人比較喜歡用SQL2000寫法的處理,用Apply時,曾比較過在多數據情況下的效率都低於SQL2000的寫法

Apply 效率在很多情況下等同於 select col=(select top Col from t where) from t a


[解决办法]

版版你忒小氣了~
[解决办法]
语句不变,引擎在不断升级,想把一句话写成永久固定语义比较难吧。

类型判断isdate,isnumeric在复杂的句子里,真正执行的位置经常飘忽不定,
我原来有个解决方案就是,用isnumeric先把正确数据提出来暂存至临时表,以后就用这个临时表了。

用起来感觉还凑合,不用在句子里费劲调整isnumeric的位置,也基本不用担心引擎的升级。
而且执行效率往往不比一个过于复杂的句子低。
[解决办法]
1.同意31楼的看法,不到万不得已不用Query/Table hint
2.遇到过类似情况(转Datetime)
3.
select
CASE WHEN ISNUMERIC(t.MyVal) = 1 THEN cast(t.MyVal as decimal(16,2)) ELSE NULL END
from #A a
cross apply
(
 select top 1 b.MyVal from #B b
 where b.A_ID=a.AID
 order by b.Sort desc
)t
where a.ItemType=0

[解决办法]
水牛帮我看帖 
http://topic.csdn.net/u/20091230/15/b44c5a6a-710e-4ca0-a3d4-5856a76025c9.html
[解决办法]
都是课本惹的祸
学了课本上的的标准简洁的SQL
却看不懂专门面向某一数据库的SQL语法
杯具……
[解决办法]
学习
[解决办法]
学习
[解决办法]
为什么hash jion 后在执行上面的 JOIN就正确呢?
[解决办法]
帮你顶一下,顺便学习
[解决办法]
我以前都是先存到临时表 ,特别是较多的T-sql逻辑时。
[解决办法]
学习
看不懂```
[解决办法]
每天学一点SQL知识....时间长了就是积累
[解决办法]
Mark!

热点排行