1 添加一个id自增表t_Next FUserID(用户唯一标示符) FTableName(要唯一id号的表的名称) FNextNo(下一个id号)
2 添加存储过程如下
GO
 Create proc [dbo].[p_Next]
 @pCOID varchar(40),
 @pTblname varchar(40),
 @pStep int,
 @pIdentity bigint out
 asif @pTblname='t_A' or @pTblname='t_B' set @pCOID='system' 特殊情况处理
begin try
 begin tranupdate t_Next
 set @pIdentity=FNext,FNext=FNext+@pStep
 where FCOID=@pCOID and FName=@pTblnameif @@rowcount=0
 begin
 if @pTblname='t_A'
 set @pIdentity=1
 else
 select @pIdentity=FCompanyID*10000000000+1
 from t_Company
 where fcoid=@pCOIDinsert into t_Next(FCOID,FName,FNext)
 values(@pCOID,@pTblName,@pIdentity+@pStep)end
 commit tran
 end try
 begin catch
 if @@trancount>0 rollback tran
 print Error_Number()
 print Error_Message()
 end catch 
 
 
 
 
 
PS:存储过程语法
一、简介:

    存储过程(Stored Procedure), 是一组为了完成特定功能的SQL 语句,集经编译后
 存储在数据库中,用户通过指定存储过程的名字并给出参数,如果该存储过程带有参数来执行它,
 在SQL Server 的系列版本中,存储过程分为两类:系统提供的存储过程和用户自定义存储过程。
 系统SP,主要存储master 数据库中,并以sp_为前缀并且系统存储过程主要是从系统表中获取
 信息,从而为系统管理员管理SQL Server。 用户自定义存储过程是由用户创建,并能完成
 某一特定功能,如:查询用户所需数据信息的存储过程。

   存储过程具有以下优点
 1.存储过程允许标准组件式编程(模块化设计)
 存储过程在被创建以后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句,而且数
 据库专业人员可随时对存储过程进行修改,但对应用程序源代码毫无影响。因为应用程序源代码只包含存
 储过程的调用语句,从而极大地提高了程序的可移植性。

 2.存储过程能够实现快速的执行速度
    如果某一操作包含大量的Transaction-SQL 代码,,或分别被多次执行,那么存储过程要比批处理的
 执行速度快很多,因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析优
 化,并给出最终被存在系统表中的执行计划,而批处理的Transaction-SQL 语句在每次运行时都要进行
 编译和优化,因此速度相对要慢一些。

 3.存储过程能够减少网络流量
    对于同一个针对数据数据库对象的操作,如查询修改,如果这一操作所涉及到的Transaction-SQL 
 语句被组织成一存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,否
 则将是多条SQL 语句从而大大增加了网络流量降低网络负载。

 4.存储过程可被作为一种安全机制来充分利用
    系统管理员通过,对执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的限
 制。 二、变量
@I
三、流程控制语句(if else | select case | while )
 Select ... CASE 实例
 DECLARE @iRet INT, @PKDisp VARCHAR(20)
 SET @iRet = '1'
 Select @iRet = 
 CASE
 WHEN @PKDisp = '一' THEN 1
 WHEN @PKDisp = '二' THEN 2
 WHEN @PKDisp = '三' THEN 3
 WHEN @PKDisp = '四' THEN 4
 WHEN @PKDisp = '五' THEN 5
 ELSE 100
 END四、存储过程格式

 创建存储过程
 Create Proc dbo.存储过程名
 存储过程参数
 AS
 执行语句
 RETURN
 执行存储过程
 GO
 *********************************************************/ 
 -- 变量的声明,sql里面声明变量时必须在变量前加@符号
 DECLARE @I INT-- 变量的赋值,变量赋值时变量前必须加set
 SET @I = 30-- 声明多个变量
 DECLARE @s varchar(10),@a INT-- Sql 里if语句
 IF 条件 BEGIN
 执行语句
 END
 ELSE BEGIN
 执行语句
 END

 DECLARE @d INT
 set @d = 1IF @d = 1 BEGIN
-- 打印
 PRINT '正确'
 END
 ELSE BEGIN
 PRINT '错误'
 END -- Sql 里的多条件选择语句.
 DECLARE @iRet INT, @PKDisp VARCHAR(20)
 SET @iRet = 1
 Select @iRet =
 CASE
 WHEN @PKDisp = '一' THEN 1
 WHEN @PKDisp = '二' THEN 2
 WHEN @PKDisp = '三' THEN 3
 WHEN @PKDisp = '四' THEN 4
 WHEN @PKDisp = '五' THEN 5
 ELSE 100
 END-- 循环语句
 WHILE 条件 BEGIN 
 执行语句
 ENDDECLARE @i INT
 SET @i = 1
 WHILE @i<1000000 BEGIN
 set @i=@i+1
 END
 -- 打印
 PRINT @i -- TRUNCATE 删除表中的所有行,而不记录单个行删除操作,不能带条件
/*
 TRUNCATE TABLE 在功能上与不带 Where 子句的 Delete 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 Delete 速度快,且使用的系统和事务日志资源少。
 Delete 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
 TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 Delete。如果要删除表定义及其数据,请
使用 Drop TABLE 语句。
 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 Where 子句的Delete 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
 TRUNCATE TABLE 不能用于参与了索引视图的表。
 示例
 下例删除 authors 表中的所有数据。*/

 TRUNCATE TABLE authors
  -- Select INTO 从一个查询的计算结果中创建一个新表。 数据并不返回给客户端,这一点和普通的
 -- Select 不同。 新表的字段具有和 Select 的输出字段相关联(相同)的名字和数据类型。

 select * into NewTable
 from Uname -- Insert INTO Select
 -- 表ABC必须存在
 -- 把表Uname里面的字段Username复制到表ABC
 Insert INTO ABC Select Username FROM Uname-- 创建临时表
 Create TABLE #temp(
 UID int identity(1, 1) PRIMARY KEY,
 UserName varchar(16),
 Pwd varchar(50),
 Age smallint,
 Sex varchar(6)
 )
 -- 打开临时表
 Select * from #temp-- 存储过程
 -- 要创建存储过程的数据库
 Use Test
 -- 判断要创建的存储过程名是否存在
 if Exists(Select name From sysobjects Where name='csp_AddInfo' Andtype='P')
 -- 删除存储过程
 Drop Procedure dbo.csp_AddInfo
 Go


 -- 创建存储过程
 Create Proc dbo.csp_AddInfo
 -- 存储过程参数
 @UserName varchar(16),
 @Pwd varchar(50),
 @Age smallint,
 @Sex varchar(6)
 AS
 -- 存储过程语句体
 insert into Uname (UserName,Pwd,Age,Sex)
 values (@UserName,@Pwd,@Age,@Sex)
 RETURN
 -- 执行
 GO

 -- 执行存储过程
 EXEC csp_AddInfo 'Junn.A','123456',20,'男' 
 
 
  

    @@ROWCOUNT (Transact-SQL) 
  
 
  
返回受上一语句影响的行数。如果行数大于 20 亿,请使用 ROWCOUNT_BIG。
 
    

      @@TRANCOUNT (Transact-SQL) 
    
 
    
返回在当前连接上已发生的 BEGIN TRANSACTION 语句的数目。
 注释 
      
 
       
BEGIN TRANSACTION 语句将 @@TRANCOUNT 增加 1。ROLLBACK TRANSACTION 将 @@TRANCOUNT 递减到 0,但 ROLLBACK TRANSACTION savepoint_name 除外,
它不影响 @@TRANCOUNT。COMMIT TRANSACTION 或 COMMIT WORK 将 @@TRANCOUNT 递减


https://blog.51cto.com/linzheng/1081900