Идентичность SQL с переменной дополняющим числом нулей - PullRequest
1 голос
/ 01 октября 2010

Мне нужно обнулить мой столбец идентификаторов для ввода выпадающих списков, например

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 ]

1 голос
/ 01 октября 2010

В этом случае было бы намного проще добавить вычисляемый постоянный столбец в таблицу SQL с таким дополненным содержимым:

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

Будучи постоянным столбцом, данные фактически сохраняются (нерассчитано на каждый доступ), так что будет быстро.Теперь просто выберите этот PaddedID столбец для выпадающего списка, и все готово!

0 голосов
/ 28 января 2011

В конце концов, это было сделано в 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 ;
        }
    }

И это все, это работает, и производительность на этом просто снизится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...