描叙:
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