【发布时间】:2015-03-02 02:09:27
【问题描述】:
我想创建一个使用存储过程创建序列号的过程。
我有三张桌子:
表 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位应该是这样的:
一天中,对于一个项目类型的第一个项目批号,第5位应该是1,当天保持1。对于下一个不同的项目批号,它应该是2,当天保持2 .
同样的规则适用于第二天和其他项目类型。
例如,假设“b”项目类型有 3 个项目批号 WB101、WB110、WB231。如果今天有人首先选择“b”项目类型的 WB110(项目批号),那么序列号应该是 xyzb1,对于今天的 WB110,它将保持 xyzb1。现在,如果接下来有人选择 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 时转换失败。
请告诉我该如何解决。
【问题讨论】:
-
您所有的 ID 类型都是 INT 即数字,并且您正试图将 xyz-some-number 存储在那里?您需要将数据类型更改为字母数字。
-
我已经编辑了我的问题。请通过它。仍然期待结果没有出来。请帮忙
标签: sql sql-server-2008 stored-procedures generator serial-number