SQL 2005升到SQL 2008算法居然都变了?真要命.莫非又是微软漏洞?

李迎春82 2013-10-07 05:17:55
create table trx (code int,quantity int)
go
create function trxCodeNew() returns int as
begin
return(isnull((select MAX(code)+1 from trx),1))
end
go

insert into trx
select dbo.trxCodeNew(),10
union all
select dbo.trxCodeNew(),15
union all
select dbo.trxCodeNew(),18

SQL 2005 结果
1,10
1,15
1,18

SQL 2008 结果
1,10
2,15
3,18

2008要如何实现2005的算法?
...全文
211 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cloud_Hero 2013-10-09
  • 打赏
  • 举报
回复
SQL Server 2008在处理union all可能有不同的算法。
tcmakebest 2013-10-09
  • 打赏
  • 举报
回复
引用 5 楼 YAKEEBZYC 的回复:
[quote=引用 2 楼 tcmakebest 的回复:] 如果单独运行 select,那结果还是如 sql2005 那样,楼主还是不要纠结于此了,给你个新的SQL:
declare @newcode int=dbo.trxcodenew()
insert into trx 
values (@newcode,10),(@newcode,15),(@newcode,18)
这种做法无法避免并发的问题.[/quote] 楼主的写法也不一定能够避免并发问题吧,这个问题需要强大的测试来验证,比较难!
李迎春82 2013-10-09
  • 打赏
  • 举报
回复
引用 2 楼 tcmakebest 的回复:
如果单独运行 select,那结果还是如 sql2005 那样,楼主还是不要纠结于此了,给你个新的SQL:
declare @newcode int=dbo.trxcodenew()
insert into trx 
values (@newcode,10),(@newcode,15),(@newcode,18)
这种做法无法避免并发的问题.
haitao 2013-10-08
  • 打赏
  • 举报
回复
select union all是被作为一次执行还是多次执行 看来2005是算1次,2008则算多次了 2楼的做法是比较明确、保险
tcmakebest 2013-10-07
  • 打赏
  • 举报
回复
如果单独运行 select,那结果还是如 sql2005 那样,楼主还是不要纠结于此了,给你个新的SQL:
declare @newcode int=dbo.trxcodenew()
insert into trx 
values (@newcode,10),(@newcode,15),(@newcode,18)
--小F-- 2013-10-07
  • 打赏
  • 举报
回复
没有O5 不知道什么问题 但是你写的这个函数得到08的结果是很正常的。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧