带有前导填充变量数的零的SQL标识

时间:2010-10-01 08:12:26

标签: sql-server tsql

我需要填充我的ID列以放入下拉组合框,例如

  

001项目文字

     

101项目文本2

但如果数字只有80,那么我们应该

  

01项目文字

     

80项文字

等等,因为我需要写这个并允许数十/数千/数百万的项目进入,我不知道我需要多少0个。

我有以下

SQL函数

-- Create a function to add 0's to the left of a string.
--Usage: 
ALTER FUNCTION [dbo].[LEFTPADNUMERIC]

               (@SourceString VARCHAR(MAX), 

                @FinalLength  INT) 

RETURNS VARCHAR(MAX) 

AS 

  BEGIN 

    RETURN 

      (SELECT Replicate('0',@FinalLength - Len(@SourceString)) + @SourceString) 

  END

它的使用方式如下:

SELECT T.Id, dbo.LEFTPADNUMERIC(Cast(T.Id AS VARCHAR(32)), (Select LEN(CAST(MAX(Id) as varchar(32))) From Task) ) + SPACE(1) + TT.TaskName
FROM Task T
JOIN TaskTranslation TT ON TT.Id = T.Id AND TT.Language = blah blah blah on and on

你知道更好,更有效的方法吗?

每次都会计算max,还是sql足够聪明地记住它?

提前致谢。

2 个答案:

答案 0 :(得分:1)

在这种情况下,将计算的持久列添加到具有此填充内容的SQL表中要容易得多:

ALTER TABLE dbo.YourTable
  ADD PaddedID AS RIGHT('00000' + CAST(ID AS VARCHAR(5)), 5) PERSISTED

作为持久列,数据实际存储(不是在每次访问时计算),因此速度很快。现在,只需在下拉框中选择此PaddedID列,就可以了!

答案 1 :(得分:0)

最后在linq到sql中完成,存储'Pad Length'

/// <summary>
    /// Calculate the amount of padding needed for this object
    /// </summary>
    /// <returns></returns>
    private static int _padLength = -1;
    private static int PadLength()
    {
        if (_padLength < 0)
        {
            Aurora.Data.AuroraDataContext db = new AuroraDataContext();
            _padLength = (from r in db.KpiForms select r.Id).Max().ToString().Length;
        }

        return _padLength;
    }

    /// <summary>
    /// Returns the display value for combo boxes
    /// </summary>
    public string DropDownDisplayTitle
    {
        get
        {
            if (this.Id <= 0) return 0.ToString().PadLeft(PadLength(), '0') + " " + this.Title ;
            return this.Id.ToString().PadLeft(PadLength(), '0') + " " + this.Title ;
        }
    }

就是这样,它起作用了,性能只会受此影响。