2017-02-21 23 views
0

我有一个带有列clnum的数据库表,它是varchar。它是数字,但可以包含前导零。给定用户在C#.Net程序中输入数字X,我需要确定表中不存在的下一个数字,并将其显示给用户。这是SQL Server 2008中有什么我能做的就是去掉所有前导零,通过所产生的数量的T-SQL存储过程,而做到这一点:带字符串的T-SQL间隙

CREATE PROCEDURE [dbo].[getNextClientNum] 

@ModelNumber AS int 
AS 

;WITH UsedNumbers (clnum, clname1) 

AS 

(
    SELECT clnum, clname1 
    FROM QueuedClientMatters 
), 

OrderedNumbers (clnum, clnum_int, clname1) 
AS 
(
    SELECT TOP 500000 clnum, CAST(clnum AS int) AS clnum_int, clname1 
    FROM UsedNumbers 
    WHERE CAST(clnum AS int) > @ModelNumber 
    ORDER BY clnum 
) 

SELECT TOP 1 previd 
FROM (SELECT clnum_int, LAG(clnum_int) OVER (ORDER BY clnum) previd 
FROM OrderedNumbers) q 
WHERE previd <> clnum_int - 1 
ORDER BY clnum_int 

我会再加入前导零回previd如此它的长度是6(所有clnums总是6位数)在我的C#程序中显示出来。但是,有没有办法绕开前面的零,然后再添加回来?

+0

您是否考虑过在表中添加计算列以提供'clnum'的整数值?它可以被保存并编入索引。 – HABO

+0

该表是我们会计系统的一部分,我不会这样做。否则,这将是一个好主意,谢谢。 – Melanie

回答

1

在转换为int之前,您不需要去掉前导零,这将在转换过程中自动发生。

使用SQL,你可以轻松地添加他们回来以后使用REPLACE(STR(FieldName,6),' ','0')

唯一真正的选择是在表中的值存储为一个字符串,所以你不松零。

+0

谢谢!我没有想到在T-SQL中添加零。你为我节省了一些编码。 – Melanie