我想创建一个使用存储过程创建序列号的过程。
我有三张桌子:
表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),
MfgDate datetime
)
对于每个项目类型,有几个项目批次编号。
现在,序列号的前3位是xyz。序列号的4位数应为项类型(例如,如果项类型为'b',则序列号应为xyzb)。
序列号的5位数应该是这样的:
在一天中,对于项目类型的第一个项目批次编号,第五个数字应为1,并且当天将保持为1。对于下一个不同的项目批次编号,它应为2,并且当天将保持为2
同样的规则适用于第二天和其他项目类型。
例如假设'b'项目类型有3个项目批号WB101,WB110,WB231。如果今天有人首先选择'b'项目类型的WB110(项目批号),那么序列号应该是xyzb1,它今天将保留xyzb1用于WB110。现在,如果有人选择了WR101,那么今天的序列号应为xyzb2。明天将首先选择“b”项目类型的项目批次编号,对于该批次编号,该类型序列号应为xyzb1。同样的规则适用于其他项目类型。
我到现在为止尝试过: 我创建了一个新表并将数据存储到该表中,并尝试检查该新表的列。
Create table Gen_SN
(
ItemType varchar(10),
ItemBatchNumber varchar(10),
SerialNumber varchar(10),
mfgDate datetime
)
Create procedure Gen_SerialNumber
(
@IitemType char(1),
@ItemBatchNumber varchar(30),
@Date datetime,
@SerialNumber varchar(10) out,
@fifthDigit int=0 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 Gen_SN WHERE SerialNumber=null or SerialNumber!=@SerialNumber)
SET @fifthDigit=1
IF EXISTS(SELECT mfgDate,ItemBatchNumber FROM Gen_SN WHERE mfgDate=@Date and ItemBatchNumber=@ItemBatchNumber)
SET @fifthDigit=1
ELSE
SET @fifthDigit=@fifthDigit+1
SET @SerialNumber=('xyz'+''+@ItemType+''+cast(@fifthdigit as varchar(2)))
INSERT INTO Gen_SN VALUES(@ItemType,@ItemBatchNumber,@SerialNumber,@Date)
END
我是SQL Server新手。从我的代码中正确生成SN的4个数字。我正面临着如何在使用相同项目类型或不同项目类型的下一个不同项目批次编号时使用日期增加第五位数字检查的值的问题。
我在执行该过程时也遇到错误。
将varchar值'a'转换为数据类型int时,转换失败。
请让我知道如何解决。
答案 0 :(得分:1)
@fifthdigit
被声明为整数。当你这样做时:
Select 'SN: xyz' + '' + @IitemType + '' + @fifthDigit
因为其中一个参数是数字,+
被解释为加法 - 并且字符串上的加法失败。
因此,要么将@fifthdigit
声明为字符串,要么进行显式转换:
Select 'SN: xyz' + '' + @IitemType + '' + cast(@fifthDigit as varchar(255))
注意:代码中可能还有其他地方存在类似问题。