如何根据Zone生成5位数的增量编号?

时间:2016-05-09 07:24:05

标签: sql sql-server-2008

 My Out put like This : If it is North "N00001
                                        N00002
                        If it is South "S00001
                                        S00002

这是我的试用代码

  Declare @Zone varchar(20),@ZoneID int,@id varchar(10)

 Set @Zone = 'S'

 Select @ZoneID = cast(isnull(max(cast(replace(Idno,@Zone,'') as numeric))+1,'00000') as varchar) from memberprofiles Where left(idno,1) = @Zone
 Set @id = @Zone+cast(@ZoneID as varchar)   
 select @id

但每次我得到“S1”但我需要“S00001”

如何生成区域号码生成

1 个答案:

答案 0 :(得分:3)

这个问题是一个“封闭的重复”候选人。但是,由于存在一些缺陷,我认为值得回答:

  1. 在您的数据库中,您似乎有一个“Idno”列,其中包含标记该区域的前导字符。如果这是真的,你应该 - 如果可能的话 - 改变设计。数字和区域标记应位于两列中。它们的任何组合都是演示问题

  2. 您的LEFT(Idno,1)表现不佳(阅读“sargability”)。如果Idno上有索引,那么Idno LIKE ' + @Zone + '%'

  3. 应该会更好
  4. 您确定,在“memberprofiles”中只有一行您的WHERE子句是真的吗?如果没有,您在SELECT后的“@ZoneID”中会看到哪个号码?

  5. 你的cast(isnull(max(cast(replace(Idno,@Zone,'') as numeric))+1,'00000') ...没有任何东西取代领先的“S”,希望还剩下一个数字。你会得到最高的数字(好的,这个答案点3,但仍然非常 - 嗯 - hacky),你仍然期望一个“NULL”,你将返回“00000”。这大声呼喊更好的设计: - )

  6. 你应该尝试进入“基于集合”的思维,而不是“程序化”思维......

  7. 试试这个

    CREATE TABLE #memberprofile(Idno VARCHAR(100),OtherColumn VARCHAR(100));
    INSERT INTO #memberprofile VALUES('N3','Test North 3'),('S24','Test South 24'),('N14','Test North 14')
    
    DECLARE @Zone VARCHAR(20)='N';
    
    SELECT *
          ,ZoneCode + REPLACE(STR(Number,5),' ','0') AS YourNewPaddedCode    
    FROM #memberprofile
    CROSS APPLY
    (
        SELECT LEFT(Idno,1) AS ZoneCode
              ,CAST(SUBSTRING(Idno,2,1000) AS INT) AS Number 
    ) AS Idno_in_parts
    WHERE ZoneCode=@Zone;
    GO
    
    --Clean up
    --DROP TABLE #memberprofile
    

    结果

    Idno    OtherColumn  ZoneCode   Number  YourNewPaddedCode
    N3      Test North 3    N        3      N00003
    N14     Test North 14   N       14      N00014