【发布时间】:2015-02-26 19:52:03
【问题描述】:
我想创建一个使用存储过程创建序列号的过程。
我有三张桌子:
表 1:
create table ItemTypes
(
ItemTypeID int not null primary key,
ItemType varchar(30)
)
表 2:
create table ItemBatchNumber
(
ItemBatchNumberID int not null primary key,
ItemBatchNumber varchar(20),
ItemType varchar(30),
)
表 3:
create table ItemMfg
(
ManufactureID int not null primary key,
ItemBatchNumberID int foreign key references ItemBatchNumber(ItemBatchNumberID),
SerialNumber varchar(10),
MfgDate datetime
)
对于每个项目类型有几个项目批号。
现在,序列号的前 3 位是 xyz。序列号的 4 位数字应为项目类型(例如,如果项目类型为“b”,则序列号应为 xyzb)。
序列号的5位应该是这样的:
在一天中,对于一个项目类型的第一个项目批号 - 第 5 位应该是 1,并且在当天保持 1。对于下一个项目批号,它应该是 2,并且在当天保持 2。
对于第二天应用相同的规则。
例如,假设“b”项目类型有 3 个项目批号 WB1、WB2、WB3。如果今天有人首先选择“b”项目类型的 WB2(项目批号),那么序列号应该是 xyzb1,对于今天的 WB2,它将保持 xyzb1。现在,如果接下来有人选择 WR1,那么今天的序列号应该是 xyzb2。明天将首先选择“b”项目类型的项目批号,该批号和该类型序列号应为 xyzb1。相同的规则适用于其他项目类型。
我已经试过了:
create procedure Gen_SerialNumber
(
@ManufactureID int,
@IitemType varchar(30),
@ItemBatchNumberID int,
@Date datetime,
@SerialNumber out,
@fifthDigit int out
)
AS
Begin
set @IitemType=(Select ItemType from ItemBatchNumber where ItemBatchNumber=@ItemBatchNumber)
Declare @SerialNumber1 varchar(20)
Set @SerialNumber1= 'xyz'+''+@IitemType+''+CAST( (Select COUNT(distinct ItemBatchNumber)from ItemBatchNumber
where ItemType=@IitemType) as varchar (10) )
Set @fifthDigit=SUBSTRING(@SerialNumber1,5,1)
IF EXISTS(SELECT SerialNumber FORM ItemMfg WHERE SerialNumber=null or SerialNumber!=@SerialNumber)
SET @fifthDigit=1
IF EXISTS(SELECT mfgDate,ItemBatchNumberID FROM ItemMfg WHERE mfgDate=@Date and ItemBatchNumberID=@ItemBatchNumberID)
SET @fifthDigit=1
ELSE
SET @fifthDigit=@fifthDigit+1
SET @SerialNumber=('xyz'+''+@ItemType+''+cast(@fifthdigit as varchar(2)))
INSERT INTO ItemMfg VALUES(@ItemType,@ItemBatchNumberID,@SerialNumber,@Date)
END
我是 SQL 新手。 SN 的第 4 位是从我的代码中正确生成的。当使用相同项目类型或不同项目类型的下一个不同项目批号时,我面临如何增加第五位数字检查的值的问题。如果您有任何疑问,请告诉我。提前致谢。
【问题讨论】:
-
请尝试格式化您的问题以便于阅读。
-
其实我不知道该怎么做:(
-
使用问题编辑器中的
{}按钮相应地获取代码和其他格式化工具。 -
如果“xyz”是一个常数,我建议它不应该是序列号的一部分。这里只有噪音。对于您的第 5 个字符,为什么不使用另一个 ROW_NUMBER 日期作为排序标准?
标签: sql sql-server-2008 stored-procedures generator serial-number