【问题标题】:Getting error while generating an unique auto Generated Serial Number for a day using stored procedure in SQL Server使用 SQL Server 中的存储过程为一天生成唯一的自动生成序列号时出错
【发布时间】: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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 很好,我必须先格式化该 SQL 语句。完全是关于语法的强迫症,所以必须先解决这个问题。
  • 我已经编辑了我的问题。请通过它。仍然期待结果没有出来。请帮忙。
猜你喜欢
  • 1970-01-01
  • 2011-11-06
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多