读书人

[怎理]SQL2008、SQL2005型判出

发布时间: 2012-01-22 22:38:43 作者: rapoo

[怎理]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!

读书人网 >SQL Server

热点推荐