SQL Server + String格式后跟递增数字解决方案

时间:2012-01-04 14:25:41

标签: sql sql-server

我有一个存储的凭证格式,其内容如下:

 [VOUTYPECODE][ISBIRTHDAY][ISREUSABLE][STARTD][ENDD]VT555 + (RunningNo)

参考下面的查询部分, @VouFormatLastNum是一种字符串格式,如下所示:

'VouT001012012010420120704VT555181'通过从凭证格式查询相应的[]括号中的项目而得到,如上所示。现在,我使用'VT555'作为阻止程序,存储在@VouFormatCore中(通过分离所有括号内的项目得出)来检索运行号码。之前发行的凭证是'181',这样我就可以为运行号码添加+1。我的下一张优惠券。

一切正常,直到我使用VT555以外的其他阻止程序更改我的凭证格式。显然,最后一张凭证仍然会有VT555,但新的@VouFormatCore已经更改为其他值,因此我无法再执行下面的查询来检索运行号码。

我一直在想办法解决这个问题。无论如何要关心分享解决方案?感谢。

--@VouFormatLastNum = 'VouT001012012010420120704VT555181' (This is obtained by querying the Top 1 voucher from the voucher table ordered by issue date.)

    Declare @position as int    
    Set @position = (select len(@VouFormatLastNum) - charindex(reverse(@VouFormatCore),reverse(@VouFormatLastNum)) +1)  

--@VouFormatLastNum will now contain the next running no. after selecting the substring below:
    Set @VouFormatLastNum = (select substring(@VouFormatLastNum, @position+1,len(@VouFormatLastNum)-@position) + 1)
    select @VouFormatLastNum
            Set @NextVoucher= @var1 + @var2 + @var3 + @var4 + @var5 + @VouFormatCore + @VouFormatLastNum

1 个答案:

答案 0 :(得分:2)

您是否可以更改存储机制?

由于您有6或7条信息,因此理想情况下,您的存储表中应包含6个或7个字段。然后可以从这些字段重构最终的字符串,同时还可以非常简单地查询单个元素......

我假设你的例子中有MS SQL Server ......

CREATE TABLE vouchers (
  id                INT IDENTITY(1,1),
  VouTypeCode       NCHAR(7)      NOT NULL,
  IsBirthday        NCHAR(2)      NOT NULL,
  IsReusable        NCHAR(2)      NOT NULL,
  StartD            SMALLDATETIME NOT NULL,
  EndD              SMALLDATETIME NOT NULL,
  PRIMARY KEY (id)
)

现在,要创建一个新的凭证,只需插入表格,除了id字段,然后将为您创建一个新的ID。您可以从该记录中创建整个凭证代码。

您还可以根据需要将数据类型更改为更灵活/适合其实际使用。并添加其他字段,例如“阻止程序”字段,以允许不同的凭证具有不同的阻止程序。


如果无法更改数据结构,则需要具体说明凭证代码的数据格式的约束。例如,我看到你使用REVERSE(),那么我可以假设'VT555'可能有时会出现在字符串的前面吗?运行数字总是设定长度,还是最大/最小长度?

如果不知道确切的约束条件,就不可能编写一个处理多个不同阻塞程序的算法。

选项可能是......

如果'VT555'永远不会出现CHARINDEX() = 0

,请检查其他阻止者

检查其他阻止程序是否为CHARINDEX() > 8(或其他某些值),因为它在字符串的早期显示为可计数。

扫描反向字符串以查找第一个非数字字符。围绕该点的字母和数字字符构成阻止程序。迭代所有阻挡者,直到找到合适的匹配。

然而,要在答案中更具体,您需要更具体地讨论问题空间。遗憾。