本文摘自:http://searchdatabase.techtarget.com.cn/tips/44/2333544.shtml?BLK=030001&NODE=1003
		
				-- ==================================================
-- 名称:得到单据流水号
-- 实现功能:取得对应表的计数器,实现流水号功能.
-- 调用示例:SELECT F_LT_GetOrderNo(FId) as FID, * from Tab1 T1
                    left outer join T_OrderList T2 on T1.FTabID = T2.FID
-- ==================================================
CREATE TABLE T_OrderList(
FID int IDENTITY (1, 1) NOT NULL,
FIncCount int -- 计数器
)
		
		
				CREATE FUNCTION F_LT_GetOrderNo(@ID int)
AS RETURN VARCHAR(32)
DECLARE @OrderNo int
SELECT @OrderNo = FIncCount FROM T_OrderList WHERE FID = @ID
    -- 取得编号后,计数器加1
UPDATE T_OrderList SET FIncCount = FIncCount +1 -- 函数中不允许执行UPDATE,这种情况要怎么处理.
RETURNS @OrderNo
		
		
				-- 系统单据表,存放系统所以业务单据列表,存有生成流水号计数器
CREATE  TABLE  T_OrderList(  
           FID  int  IDENTITY  (1,  1)  NOT  NULL,  
           FIncCount  int  --  计数器  
           FOrder varchar(30) not Null
           )  
		
		
				-- 系统业务单据,存放企业日常业务数据,具体每单有一个单据流水号
CREATE  TABLE  T_Order(  
           FID  int  IDENTITY  (1,  1)  NOT  NULL,  
           FNumber varchar(40),  -- 单据流水号  
           FOrderInfo varchar(30)
           )  
		
		
				-- 现系统要求自动运算,将运算后的数据填充到T_Order业务表中.填充时各记录要生成不同的单据流水号.我原先的实现想法是用存储过程:
CREATE    PROCEDURE P_OnlyC
  @CodeC VARCHAR(48) OUTPUT
AS
DECLARE @OnlyC VARCHAR(48)
,@FIncCount INTEGER
		
		
				-- 取出当前单据流水号
SELECT @FIncCount=FIncCount FROM T_OrderList WHERE FID=@CodeC
-- 流水号加1
SELECT @FIncCount = @FIncCount +1
		
		
				UPDATE T_OrderList SET FIncCount = @FIncCount WHERE FID= @CodeC
		
		
				-- 组织各个编码
SELECT @OnlyC = @CodeC  + '-' + @OnlyC
SELECT @CodeC = @OnlyC; SELECT @OnlyC AS FNumber
-- print @CodeC
GO
		
		
				但这程方法不能在SELECT语句运算出的结果中调用.如前面写的SELECT P_OnlyC(FId)  as  流水号,  *  from (select sum(..) from tab..) Tab1  所以我想用函数,但函数里又没办法执行递增流水号:
		
		
				CREATE  FUNCTION  F_LT_GetOrderNo(@ID  int)  
AS  RETURN  VARCHAR(32)  
           DECLARE  @OrderNo  int  
           SELECT  @OrderNo  =  FIncCount  FROM  T_OrderList  WHERE  FID  =  @ID  
       --  取得编号后,计数器加1  
           UPDATE  T_OrderList  SET  FIncCount  =  FIncCount  +1  --  函数中不允许执行UPDATE  
           RETURNS  @OrderNo 
           
           
           
CREATE PROCEDURE n_GetBillNo 
@billType  char(2),--单据类型
@BillOutNo  nvarchar(50) Output
		
		
				 AS
		
		
				Begin
		
		
				declare @NowNO int
declare @date char(10)
declare @Symbol nvarchar(10)
declare @ErrorMsg nvarchar(200)
		
		
				Set NoCount On
Begin Tran
--设定延时
SET LOCK_TIMEOUT 5000
		
		
				--取当前序号
Select @NowNO=fnumber,@Symbol=fCode,@date=Convert(char(8),fDate,112) from n_BillNo  With(xLock) where fcode=@BillType
if @@Error<>0
   begin
   Set @ErrorMsg='数据被锁定,请求超时!'
   Goto Failed
   end
--是否是新的一月
if Convert(char(8),getdate(),112)<>@date
 Set @NowNo=1
 else
 Set @NowNo=@NowNo+1
		
		
				--更新当前序列号和设置最后更新日期
update n_BillNo set fNumber=@NowNO,fDate=GetDate() where fcode=@BillType
if @@Error<>0
   begin
   Set @ErrorMsg='更新外部序列号失败!'
   Goto Failed
   end
		
		
				--取得单号
Set @BillOutNo=lTrim(@SymBol)+Convert(char(8),GetDate(),112)+Right(('0000'+Convert(varchar,@NowNO)),4)
		
		
				Goto Succeed
		
		
				Failed:
  RaisError(@ErrorMsg,16,1)
  Rollback Tran  
  Set NoCount Off
  Return 1
		
		
				Succeed:
  Commit Tran
  Set NoCount Off
  Return 0
		
		
				End
GO