相比之下,说:
REPLICATE(@padchar, @len - LEN(@str)) + @str
相比之下,说:
REPLICATE(@padchar, @len - LEN(@str)) + @str
当前回答
我知道这在这一点上没有增加太多的对话,但我正在运行一个文件生成程序,它的速度非常慢。我一直在使用复制,看到了这种修剪方法,并认为我应该给它一个机会。
在我的代码中,你可以看到在这两个变量之间的切换是除了新的@padding变量(以及现在存在的限制)。我在两种状态下用函数运行我的过程,在执行时间内得到了相同的结果。因此,至少在SQLServer2016中,我没有看到其他发现的效率有任何差异。
无论如何,这是我的UDF,我写了几年前加上今天的变化,这是非常相同的,因为它有一个左/右参数选项和一些错误检查。
CREATE FUNCTION PadStringTrim
(
@inputStr varchar(500),
@finalLength int,
@padChar varchar (1),
@padSide varchar(1)
)
RETURNS VARCHAR(500)
AS BEGIN
-- the point of this function is to avoid using replicate which is extremely slow in SQL Server
-- to get away from this though we now have a limitation of how much padding we can add, so I've settled on a hundred character pad
DECLARE @padding VARCHAR (100) = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
SET @padding = REPLACE(@padding, 'X', @padChar)
SET @inputStr = RTRIM(LTRIM(@inputStr))
IF LEN(@inputStr) > @finalLength
RETURN '!ERROR!' -- can search for ! in the returned text
ELSE IF(@finalLength > LEN(@inputStr))
IF @padSide = 'L'
SET @inputStr = RIGHT(@padding + @inputStr, @finalLength)
--SET @inputStr = REPLICATE(@padChar, @finalLength - LEN(@inputStr)) + @inputStr
ELSE IF @padSide = 'R'
SET @inputStr = LEFT(@inputStr + @padding, @finalLength)
--SET @inputStr = @inputStr + REPLICATE(@padChar, @finalLength - LEN(@inputStr))
-- if LEN(@inputStr) = @finalLength we just return it
RETURN @inputStr;
END
-- SELECT dbo.PadStringTrim( tblAccounts.account, 20, '~' , 'R' ) from tblAccounts
-- SELECT dbo.PadStringTrim( tblAccounts.account, 20, '~' , 'L' ) from tblAccounts
其他回答
有几个人给出了不同的版本:
right('XXXXXXXXXXXX'+ @str, @n)
要小心,因为如果它比n长,它会截断实际数据。
在SQL Server 2005及以后的版本中,您可以创建一个CLR函数来完成此操作。
我不确定你给出的方法真的是低效的,但另一种方法,只要它不需要灵活的长度或填充字符,将是(假设你想用“0”到10个字符填充它:
DECLARE
@pad_characters VARCHAR(10)
SET @pad_characters = '0000000000'
SELECT RIGHT(@pad_characters + @str, 10)
要提供四舍五入到小数点后两位,但如果需要,右补零,我有:
DECLARE @value = 20.1
SET @value = ROUND(@value,2) * 100
PRINT LEFT(CAST(@value AS VARCHAR(20)), LEN(@value)-2) + '.' + RIGHT(CAST(@value AS VARCHAR(20)),2)
如果有人能想出一种更简洁的方法,那将是非常感激的——上面的方法似乎很笨拙。
注意:在本例中,我使用SQL Server以HTML格式发送电子邮件报告,因此希望格式化信息,而不涉及额外的工具来解析数据。
这个怎么样:
replace((space(3 - len(MyField))
3是要填充的零的个数