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

时间: 2024-10-14 09:06:56

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

Oracle 在函数或存储过程中执行一条插入语句并返回主键ID值

有时,我们需要往一张表插入一条记录,同时返回主键ID值. 假定主键ID的值都是通过对应表的SEQUENCE来获得,然后进行ID赋值 这里有几种情况需要注意: 1)如果建表语句含有主键ID的触发器,通过触发器来实现主键ID的自增,实现方式如下: INSERT INTO GP_MONTH_BILL ( MONTH, BONUS_VALUE, CUR_WAY, CUR_TIME, STATUS, IS_USE, CREATE_TIME) VALUES ( CUR_MONTH, CUR_BONUS_VA

Oracle主键自动生成_表and存储过程

-- Create table create table T_EB_SYS_DN_SEQUENCE_CONFIG ( sequence_id VARCHAR2(36) default sys_guid() not null, sequence_name VARCHAR2(50) not null, sequence_desc VARCHAR2(200), sequence_len INTEGER default 4 not null, reset_type INTEGER default 2 n

SQL Server主键自动生成_表and存储过程

主键表: CREATE TABLE [dbo].[KEYCODE]( [KeyName] [varchar](12) NOT NULL, [KeyTableName] [varchar](40) NULL, [KeyFieldName] [varchar](30) NULL, [StrLen] [int] NULL, [CodeLen] [int] NULL, [CodeMin] [float] NULL, [CodeMax] [float] NULL, [CodeType] [varchar]

OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)

公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当然,可以用代码生成器,不过配套的代码生成器暂时没有):又从网上找了一个封装了泛型方法的OracleHelper类,整合到一起,但貌似数据增删改查依然不方便:于是花了两天时间,在原有基础上对增删改查分页查询操作进行了面向对象的封装,并且对批量增删改操作进行事务封装,写事务代码更方便. 原理: 1.利用

一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器

一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字段的删除过程中需不需要对数据进行备份 ''' 二.路由基础 ''' # url中含有四个参数 # url(regex, view, kwargs=None, name=None) # 正则路径 视图函数地址 默认关键字参数(了解) 路由别名 # r'index' 只要请求中含有index都可以匹配成

yii中数据的"增删改查"相关工作!(此文比较乱,需细看)

使用findByPk()根据数据表主键查询的是对象,不需要使用foreach()循环出来 但是使用findall()和find()查询的是对象类型的数组需要使用foreach()循环出来 ======================================= public function getMinLimit () { $sql = "..."; $result = yii::app()->db->createCommand($sql); $query = $r

【安卓9】ORM、ORM方法改写增删改操作

ORM ORM是Object/Relational Mapping的缩写,译为对象关系映射.采用键-值对的形式存放字段的这种方式的好处是:无需SQL语句即能对数据进行添加.修改操作. SQLitDatabase类封装了 insert().delete().update()方法,这三个方法无需用SQL语句就能对数据库进行增删改的操作. Java是面向对象的语言,目前流行的数据库大多是关系型数据库.ORM使得面向对象编程能容易地处理关系数据库中的数据. 操作步骤: 步骤1.创建ContentValu

MongoDB文档的增删改操作

上一篇文章中介绍了MongoDB的一些基本知识,同时看到了怎么启动一个MongoDB服务,并且通过MongoDB自带的shell工具连接到了服务器. 这一次,就通过MongoDB shell介绍一下对文档的增删改操作. 增加新文档 接着上一篇文章,打开一个MongoDB shell. 通过“show dbs”可以看到所有的数据库.然后我们通过“use blog”切换到blog数据库来开始下面的演示. 使用“db”命令显示当前正在使用的数据库. 1 C:\mongodb\bin>mongo.exe

DOM访问HTML元素的方式,DOM访问表单控件的常用属性和方法,DOM访问列表框、下拉菜单的常用属性,DOM访问表格子元素的常用属性和方法,DOM对HTML元素的增删改操作

DOM访问HTML元素的方式 为了动态地修改HTML元素,须先访问HTML元素.DOM主要提供了两种方式来访问HTML元素: 根据ID访问HTML元素:通过document对象调用getElementById()方法来查找具有唯一id属性值的元素. 利用节点关系访问HTML元素.常用的属性和方法如下: parentNode 返回当前节点的父节点 previousSibling 返回当前节点的前一个兄弟节点 nextSibling 返回当前节点的后一个兄弟节点 childNodes 返回当前节点的