【IT168 技术文档】这个问题似乎很简单:创建一个用户定义的函数,这个函数允许填充理想字符是有限数量的一个字符串。一旦我决定填充的位置能够定制以便满足最终用户的要求时,这个实验就变成一个涉及更多问题的函数从而变得不能满足需要了。
虽然Transact-SQL (T/SQL)没有提供一个类似于其他关系数据库所提供的LPAD和RPAD的可比函数,但是SQL Server专业版提供了REPLICATE()函数,它可以用来建立一个简单的用户定义函数从而填充一个字符串。在讲解定制填充函数的代码之前,让我们来看看这个REPLICATE()函数以及它能够提供什么吧。
REPLICATE (string_expression ,integer_expression)允许你复制一个字符串(string_expression参数是指每个integer_expression参数连续的次数)。
下面是这个函数的一个简单实例:
SELECT REPLICATE('ABCDE|', 3)
------------------
ABCDE|ABCDE|ABCDE|
(1 row(s) affected)
------------------
ABCDE|ABCDE|ABCDE|
(1 row(s) affected)
尽管REPLICATE()函数允许你返回一个最高可达8000字节的字符串,我将要创建的这个函数将基于varchar(100)的一个输出结果值。你可以修改这个值来满足你的要求,尽管如此,我很少需要填充一个大于20个字符的字符串值。我认为创建一个函数用于一个未填充字符串的左边或右边是值得的。接下来,问题就变得很有趣,那就是如果由于某些原因你需要在字符串中间填充怎么办?在该字符串的左边和右边都平均填充怎么样呢?无论你是否使用这些选项,这个功能都会提供给你。下面的代码就是我创建的函数。
CREATE FUNCTION [dbo].[usp_pad_string]
(
@string_unpadded VARCHAR(100),
@pad_char VARCHAR(1),
@pad_count tinyint,
@pad_pattern INT)
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @string_padded VARCHAR(100)
SELECT @string_padded =
CASE @pad_pattern
WHEN 0 THEN REPLICATE(@pad_char, @pad_count) + @string_unpadded --pad left
WHEN 1 THEN @string_unpadded + REPLICATE(@pad_char, @pad_count) --pad right
WHEN 2 THEN
--pad center
LEFT(@string_unpadded, FLOOR(LEN(@string_unpadded)/2))
+ REPLICATE(@pad_char, @pad_count)
+ RIGHT(@string_unpadded, LEN(@string_unpadded) - FLOOR(LEN(@string_unpadded)/2))
WHEN 3 THEN
--pad edges
REPLICATE(@pad_char, FLOOR(@pad_count/2))
+ @string_unpadded
+ REPLICATE(@pad_char, @pad_count - FLOOR(@pad_count/2))
END
RETURN @string_padded
END
(
@string_unpadded VARCHAR(100),
@pad_char VARCHAR(1),
@pad_count tinyint,
@pad_pattern INT)
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @string_padded VARCHAR(100)
SELECT @string_padded =
CASE @pad_pattern
WHEN 0 THEN REPLICATE(@pad_char, @pad_count) + @string_unpadded --pad left
WHEN 1 THEN @string_unpadded + REPLICATE(@pad_char, @pad_count) --pad right
WHEN 2 THEN
--pad center
LEFT(@string_unpadded, FLOOR(LEN(@string_unpadded)/2))
+ REPLICATE(@pad_char, @pad_count)
+ RIGHT(@string_unpadded, LEN(@string_unpadded) - FLOOR(LEN(@string_unpadded)/2))
WHEN 3 THEN
--pad edges
REPLICATE(@pad_char, FLOOR(@pad_count/2))
+ @string_unpadded
+ REPLICATE(@pad_char, @pad_count - FLOOR(@pad_count/2))
END
RETURN @string_padded
END