使用SQL Server中的存储过程生成一天中唯一的自动生成的序列号时出错

时间:2015-03-02 02:09:27

标签: sql sql-server-2008 stored-procedures generator serial-number

我想创建一个使用存储过程创建序列号的过程。

我有三张桌子:

表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时,转换失败。

请让我知道如何解决。

1 个答案:

答案 0 :(得分:1)

@fifthdigit被声明为整数。当你这样做时:

Select 'SN: xyz' + '' + @IitemType + '' + @fifthDigit

因为其中一个参数是数字,+被解释为加法 - 并且字符串上的加法失败。

因此,要么将@fifthdigit声明为字符串,要么进行显式转换:

Select 'SN: xyz' + '' + @IitemType + '' + cast(@fifthDigit as varchar(255))

注意:代码中可能还有其他地方存在类似问题。