代码之家  ›  专栏  ›  技术社区  ›  adudley

前导填充变量为零的SQL标识

  •  1
  • adudley  · 技术社区  · 14 年前

    我需要零填充我的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
    

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

    它是每次都要计算最大值,还是SQL足够聪明来记住这一点?

    事先谢谢。

    2 回复  |  直到 14 年前
        1
  •  1
  •   marc_s HarisH Sharma    14 年前

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

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

    作为持久化列,数据实际上是存储的(不是在每次访问时计算),因此速度很快。现在选择这个 PaddedID 为你的下拉框列,你很好去!

        2
  •  0
  •   adudley    14 年前

    最后,它在linq to 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 ;
            }
        }
    

    也就是说,它是有效的,而且性能在这一点上会受到影响。