sqlSever 存储过程 中 创建 事务(增删改操作),唯一的主键自动生成 (格式:自定义字母+时间+五位数字,例如:S2014103010001)...

 

描叙:

  1、使用带事务的sql 存储过程。

  2、添加数据时,自动创建唯一的主键 格式 【一个字母】+【时间格式】+【一个五位数】

  3、使用游标,通过另一个表的多条数据,来对当前表数据的添加,并自动生产 唯一主键 格式如上。

  4、使用场景:增加主键唯一的主表数据的同时,从另一个表读取多条数据然后添加到子表中,并且生产的主键唯一。

  5、使用环境: sqlserver。

 

 

USE [MicroMall]
GO
/****** Object: StoredProcedure [dbo].[SaleOrderIUProc] Script Date: 10/30/2014 16:13:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SaleOrderIUProc]
@clientId VARCHAR(10) ,
@returnMsg VARCHAR(50) OUTPUT
AS
BEGIN TRAN

DECLARE @itemId VARCHAR(20) --定义游标用到的变量
DECLARE @intId VARCHAR(30) --初始化变量 格式为:【一个字母】+【时间格式】+【10000】

--主表变量的定义

DECLARE @maxId INT --(范围:10001-19999) 例如:10001 注:需要查主表当天最大的主键列的值
DECLARE @newId VARCHAR(30) --生成 【一个字母】+【时间格式】+【@maxId】的唯一主键 例如: S2014103010001

--子表变量的定义

DECLARE @maxDetailId INT --(范围:10001-19999) 例如:10001 注:需要查子表当天最大的主键列的值
DECLARE @newDetailId VARCHAR(30)--生成 【一个字母】+【时间格式】+【@maxId】的唯一主键 例如: D2014103010001


--初始化数据:S2014103010000
SET @intId = 'S' + CONVERT(CHAR(8), GETDATE(), 112) + RIGHT('0'
+ CONVERT(VARCHAR(10), 10000),
5)

--主表当天主键去掉字母时间 最大的5位数
SET @maxId = CONVERT(INT, SUBSTRING(( SELECT ISNULL(MAX(saleOrderId),
@intId)
FROM SaleOrder
WHERE 0 = DATEDIFF(DD, orderDate,
GETDATE())
), 9, 10)) + 1
--生成主表新增数据的 唯一主键值
SET @newId = 'S' + CONVERT(CHAR(8), GETDATE(), 112) + RIGHT('0'
+ CONVERT(VARCHAR(10), @maxId),
5)
--子表当天主键去掉字母时间 最大的5位数
SET @maxDetailId = CONVERT(INT, SUBSTRING(( SELECT ISNULL(MAX(saleDetId),
@intId)
FROM [SaleDet]
WHERE 0 = DATEDIFF(DD,
createDate,
GETDATE())
), 9, 10))



--插入主表数据
INSERT INTO SaleOrder
( saleOrderId, orderDate )
VALUES ( @newId, GETDATE() )

--插入子表数据 (从另一个表读取,并插入多条,使用游标控制)

----------------使用游标开始-----------------

--定义一个游标
DECLARE cursorOfResult CURSOR
FOR
SELECT t.itemId
FROM ( SELECT titemId AS 'itemId'
FROM TempOrder
) t
--打开游标
OPEN cursorOfResult

--获取数据,游标下移一行
FETCH NEXT FROM cursorOfResult INTO @itemId

WHILE @@fetch_status = 0--检测获取数据是否成功
BEGIN

SET @maxDetailId = @maxDetailId + 1 --由于事务没有提交,所以必须使用游标来对maxId进行处理

--生成子表主键值的正确格式
SET @newDetailId = 'S' + CONVERT(CHAR(8), GETDATE(), 112)
+ RIGHT('0' + CONVERT(VARCHAR(10), @maxDetailId), 5)

--新增订单明细信息
INSERT INTO SaleDet
( saleDetId ,
saleOrderId ,
itemId ,
createDate
)
VALUES ( @newDetailId ,
@newId ,
@itemId ,
GETDATE()
);

--游标继续下移
FETCH NEXT FROM cursorOfResult INTO @itemId
END

CLOSE cursorOfResult--关闭游标

DEALLOCATE cursorOfResult

----------------使用游标结束-----------------

--删除购物车

DELETE FROM TempOrder
WHERE clientId = @clientId


IF @@ERROR <> 0
BEGIN
ROLLBACK
SELECT @returnMsg = '0'
END
ELSE
BEGIN
COMMIT
SELECT @returnMsg = '1'

END

RETURN @returnMsg

 

转载于:https://www.cnblogs.com/wangdi0827/p/4063220.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值