怎么实现函数返回结果和行数匹配并且支持并发

文盲老顾
WEB应用领新星创作者
博客专家认证
2018-02-26 01:33:09
我现在有一个表a,字段如下
create table a(id int identity primary key,dt datetime default getdate(),sn varchar(20))

其中字段sn为一个唯一型的数据,格式为dt的日期转成yyyyMMdd以及该记录在当天数据中的顺序,为避免出现物理删除操作造成sn变动,所以存储到物理字段中,并且根据该字段计算下一个sn

之前我一直是使用触发器完成这个操作,但是现在需要在插入数据的同时生成sn,因为马上就要用到,而触发器可能略有延迟,造成程序异常,所以考虑是否可以使用函数来实现这样的功能


insert into a(dt,sn) values(getdate(),getSN()) --因为是插入的第一条数据,sn的值是201802261
insert into a(dt,sn) values(getdate(),getSN()) --因为是插入的第二条数据,sn的值是201802262
insert into a(dt,sn) values(getdate(),getSN()) --因为是插入的第三条数据,sn的值是201802263
insert into a(dt,sn) values(getdate(),getSN()) --因为是插入的第三条数据,sn的值是201802264
delete from a where sn='201802263'
delete from a where sn='201802262' -- 删除部分数据,但不影响sn生成,即使用最后一条sn作为计算依据,如果删除的条目为最后一条,则该sn可再次利用,否则跳过
insert into a(dt,sn) select dt,getSN() from a -- 因为表a中有两条数据,且最后一条sn为201802264,所以getSN()生成两个sn,匹配这两条数据,分别是201802265和201802266
insert into a(dt,sn) select dt,getSN() from a -- 因为表a中有4条数据,且最后一条sn为201802266,所以getSN()生成两个sn,匹配这两条数据,分别是201802267、201802268、201802269和2018022610


除此之外,插入数据可能出现并发情况,函数是否可以进行队列处理,即单线程运行,避免出现重复的sn
...全文
678 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
卖水果的net 2018-02-26
  • 打赏
  • 举报
回复
函数的作用,是返一个值 (数字、字符串、日期等类型) 所以说,函数不能实现 你说的这个功能 : 你可以有这个列上建一个 唯一约束(唯一索引),来防止并发。 -- 示例: drop table test go create table test(id int unique) go insert into test select isnull(max(id),0) + 1 from test go select * from test go
吉普赛的歌 2018-02-26
  • 打赏
  • 举报
回复
引用 2 楼 superwfei 的回复:
也就是说,sqlserver里,自定义函数无法实现开窗函数那样的功能?
关键是你怎么防止并发?
文盲老顾 2018-02-26
  • 打赏
  • 举报
回复
也就是说,sqlserver里,自定义函数无法实现开窗函数那样的功能?
吉普赛的歌 2018-02-26
  • 打赏
  • 举报
回复
函数没办法搞这么复杂的功能, 用存储过程来实现插入吧 至于排队, 可以参考: http://blog.csdn.net/yenange/article/details/78903480

27,579

社区成员

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

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