首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

批改一存储过程,非常感谢,就这么多分了

2013-02-06 
修改一存储过程,非常感谢,就这么多分了,--小爱,820帮忙写的代码,在临时可以,到正式表怎么就更新一个?if ob

修改一存储过程,非常感谢,就这么多分了,

--小爱,820帮忙写的代码,在临时可以,到正式表怎么就更新一个?
if object_id('[Tab]') is not null drop table [Tab]
go 
CREATE TABLE [dbo].[Tab](
[ID] [int] IDENTITY(1,1) NOT NULL,--自增
[type] [varchar](50),--编号类型,比如是仓库编号,或者订单编号、商品编号这类的
[code] [varchar](50) NOT NULL,--这个存编号最大值,你的编号是根据某种规则生成的,比如是ABC1234DFG001 不管前面是什么规则,增量肯定是int类型的增量,所以这里存int 就可以了
[seed] int,--这个存每次的增量,通常是1
[date] [date] NULL--这里存日期类型比较方便

 CONSTRAINT [PK_Tab] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

if object_id('p_GetID','P') is not null drop proc p_GetID
go 
-- 取下一个编号的公共存储过程
CREATE PROC dbo.p_GetID
    @type varchar(50)='仓库',--这个对应的是区号表里里面的类型
    @seed int=1--这个存每次的增量
AS 
SET NOCOUNT ON;
declare @d date=getdate(), @code int=0 --最大编号

--这里做个判断,某种类型的编号,切当天还没有取过号的话,就需要初始化一条数据
--加上行锁
begin try
begin tran
 if  not exists(select 1 from [Tab] with(rowlock) where [type]=@type and [date]=@d) 
insert into [Tab] select @type,1,@seed,@d 
--如果插入了 说明是第一次初始化的,所以最大值就是1 ,就可以直接return了
if @@rowcount>0
begin
 set @code=1
 if @@trancount>0
 commit tran 
 return @code
end
--这里是已经存在记录了,所以更新一下取号表就可以了
UPDATE dbo.[Tab]
SET
    @code = [code] + seed,
    [code] = @code
WHERE [type]=@type and [date]=@d
;
 if @@trancount>0
 commit tran 
 return @code
end try
begin catch
 if @@trancount>0
 rollback tran 
 return @code
end catch 
GO
--拼接SQL语句,循环更新SDNO,为什么只更新了一条?
declare @letter varchar(10)='KH',    --首字母,可以多个字母    
@id int , --流水号
@TLSH VARCHAR(20)--编号

declare @cnt int,@i int =1,@KHNAME nvarchar(30),@rowcoun int

select @cnt =@@rowcount
while @i<=@cnt
begin 
exec  @id=dbo.p_GetID '仓库',1
SET @TLSH=@letter+CONVERT(VARCHAR(6),GETDATE(),112)+right(10000+@id,4)    
update TEORD set [SDNO]=@TLSH where id=@i and [SDNO]=''
select top 1 @KHNAME=KHNAME from TEORD where id=@i
update  TEORD set [SDNO]=@TLSH where KHNAME=@KHNAME
set @i=@i+@@rowcount
end 
select * from TEORD
/*
ID          SDNO            SDDATE                  SDREN      KHNAME               KHADDESS                                           KHTEll               KHTOPO               SKUNAME              SKU                  CQTY                   ZQTY                   JQTY


----------- --------------- ----------------------- ---------- -------------------- -------------------------------------------------- -------------------- -------------------- -------------------- -------------------- ---------------------- ---------------------- ----------------------
1           KH2013010008    2013-01-18 12:26:24.703 曹宏        广刷厂                白云区白云大道广东外语外贸大学内                                卢义珍                  362479             TN11                04                 2                      NULL                   2
2           NULL            2013-01-18 12:26:24.703 罗平        天山                 广州市天河区五技东街师院北侧103号                              梁宗想                  137517451          TN11                A0TH050              4                      NULL                   4
3           NULL            2013-01-18 12:26:24.703 曹宏        华特                  花都区汽车城东道西C栋                                      张国美                  136322491          T210K               NULL                 2                      NULL                   2
4           NULL            2013-01-18 12:26:24.703 曹宏        华特                  花都区汽车城东道西C栋                                      张国美                  136322491          T210C               NULL                 1                      NULL                   1


5           NULL            2013-01-18 12:26:24.703 曹宏        耐志                  花都区汽车城北路                                         利志衡                  159158148          T21K               A1191              2                      NULL                   2
6           NULL            2013-01-18 12:26:24.703 陈熹        漫可                 建设六马路33号场505室                                   黄小姐                  836345             T17                A20              1                      NULL                   1
7           NULL            2013-01-18 12:26:24.703 吴斌        达瓦                  荔湾区浣花路鹏德宝商务中心8131室                            李媛                   815018             K粉                   A0X82              1                      NULL                   1
8           NULL            2013-01-18 12:26:24.703 林1         茂彩                 茂名市迎宾二路大院3号首层商铺                                江劲                   NULL                 废盒                  A70200           1                      NULL                   1


9           NULL            2013-01-18 12:26:24.703 侯青        珍告                 体育西路103号维多场A场33楼                                 彭小姐                  381815             T11                NULL                 1                      NULL                   1

*/



执行代码,只更新了一条..大牛们出来帮帮忙吧!,就这么多分了.!
[解决办法]
--拼接SQL语句,循环更新SDNO,为什么只更新了一条?
declare @letter varchar(10)='KH',    --首字母,可以多个字母    
@id int , --流水号
@TLSH VARCHAR(20)--编号
 
declare @cnt int,@i int =1,@KHNAME nvarchar(30),@rowcoun int
 
--select @cnt =@@rowcount
改成:select @cnt =(SELECT COUNT(1) FROM TEORD)
while @i<=@cnt
begin 
    exec  @id=dbo.p_GetID '仓库',1
    SET @TLSH=@letter+CONVERT(VARCHAR(6),GETDATE(),112)+right(10000+@id,4)    
    update TEORD set [SDNO]=@TLSH where id=@i and [SDNO]=''
    select top 1 @KHNAME=KHNAME from TEORD where id=@i
    update  TEORD set [SDNO]=@TLSH where KHNAME=@KHNAME
    set @i=@i+@@rowcount
end 
select * from TEORD

热点排行