我有一个存储的凭证格式,其内容如下:
[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
答案 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
(或其他某些值),因为它在字符串的早期显示为可计数。
扫描反向字符串以查找第一个非数字字符。围绕该点的字母和数字字符构成阻止程序。迭代所有阻挡者,直到找到合适的匹配。
然而,要在答案中更具体,您需要更具体地讨论问题空间。遗憾。