我的车号有两部分
3 位是序列号,后 8 位是发票的月份和年份
例如:001072013
所以如果我想要下一个InvoiceNo
我像这样从数据库中最后输入的发票号码中选择
select TOP 1 InvoiceNo
from BuyInvoice
将前 3 位数字剪掉,然后递增,并结合到发票的月份和年份
所以它会是002072013
问题是上面的语句没有返回最后一个条目值
上升和下降都不起作用
我的车号有两部分
3 位是序列号,后 8 位是发票的月份和年份
例如:001072013
所以如果我想要下一个InvoiceNo
我像这样从数据库中最后输入的发票号码中选择
select TOP 1 InvoiceNo
from BuyInvoice
将前 3 位数字剪掉,然后递增,并结合到发票的月份和年份
所以它会是002072013
问题是上面的语句没有返回最后一个条目值
上升和下降都不起作用
我会尝试:
select TOP 1 InvoiceNo
from BuyInvoice order by right(InvoiceNo,4) desc,
right(InvoiceNo, 6) desc,
InvoiceNo desc
尝试
select top 1 InvoiceNo from BuyInvoice order by left(InvoiceNo,3) desc
我假设该BuyInvoice
表有一列与列的部分InvoiceDate
具有相同的值。date
InvoiceNo
在这种情况下,我会使用(未测试解决方案):
DECLARE @InvoiceDate DATE;
SET @InvoiceDate='2013-07-20';
BEGIN TRANSACTION;
DECLARE @LastInvoiceNo VARCHAR(9);
SELECT TOP(1) @LastInvoiceNo=bi.InvoiceNo
-- This table hint (UPDLOCK) take a U lock on this row[s] so any concurrent [similar] transactions will have to wait till this transaction is finished
-- This will prevent duplicated new InvoiceNo
FROM dbo.BuyInvoice bi WITH(UPDLOCK)
WHERE bi.InvoiceDate=@InvoiceDate
ORDER BY bi.InvoiceNo DESC;
DECLARE @Seq SMALLINT;
SET @Seq=ISNULL(CONVERT(SMALLINT,LEFT(@LastInvoiceNo,3)),0);
SET @Seq=@Seq+1;
DECLARE @NewInvoiceNo VARCHAR(9);
SET @NewInvoiceNo=RIGHT('00'+CONVERT(VARCHAR(3),@Seq),3)+STUFF(STUFF(CONVERT(VARCHAR(10),@InvoiceDate,101),3,1,''),5,1,''); -- Convert style 101 = mm/dd/yyyy
...
INSERT dbo.BuyInvoice(InvoiceNo,InvoiceDate,...)
VALUES (@NewInvoiceNo,@InvoiceDate,...);
...
COMMIT TRANSACTION;
另外,如果需要,我会BEGIN TRY ... END CATCH
用来拦截异常并回滚此事务(链接:示例 B)。
此外,我将创建以下索引:
-- This way, the InvoiceNo column will have uniques values
CREATE UNIQUE INDEX IUN_BuyInvoice_InvoiceNo
ON dbo.BuyInvoice(InvoiceNo);
GO
-- This index is used by SELECT TOP(1) ... query
CREATE UNIQUE INDEX IN_BuyInvoice_InvoiceDate_InvoiceNo
ON dbo.BuyInvoice(InvoiceDate,InvoiceNo);
GO
尝试这个
select TOP 1 InvoiceNo
from BuyInvoice order by InvoiceNo desc