我需要填充我的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足够聪明地记住它?
提前致谢。
答案 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 ;
}
}
就是这样,它起作用了,性能只会受此影响。