我有一个客户表,我想用它来填充SSRS 2008中的参数框。cust_num
是值,cust_name
和cust_addr
的串联将是标签。表中的必填字段为:
cust_num int PK
cust_name char(50) not null
cust_addr char(50)
SQL是:
select cust_num, cust_name + isnull(cust_addr, '') address
from customers
在参数列表中给出了这个:
FIRST OUTPUT - ACTUAL
1 cust1 addr1
2 customer2 addr2
这是我的预期,但我想要:
SECOND OUTPUT - DESIRED
1 cust1 addr1
2 customer2 addr2
我尝试过:
select cust_num, rtrim(cust_name) + space(60 - len(cust_name)) +
rtrim(cust_addr) + space(60 - len(cust_addr)) customer
from customers
这给了我第一个输出。
select cust_num, rtrim(cust_name) + replicate(char(32), 60 - len(cust_name)) +
rtrim(cust_addr) + replicate(char(32), 60 - len(cust_addr)) customer
这也给了我第一个输出。
我也尝试将space()
替换为char(32)
,反之亦然
我尝试过substring
,left
,right
的各种变体都无济于事。
我还在各个地方使用了ltrim
和rtrim
。
60的原因是我检查了两个字段中的最大长度并且它是50并且我希望字段之间有一些空格,即使字段是最大的。我并不真正关心截断的数据,因为城市,州和邮政在不同的领域,所以如果街道地址的末尾被砍掉,我猜是可以的。
这不是一个显示阻止,SSRS报告目前已部署第一个输出,但我想让它更清洁,如果我可以。
答案 0 :(得分:63)
Whammo blammo(领先空间):
SELECT
RIGHT(space(60) + cust_name, 60),
RIGHT(space(60) + cust_address, 60)
OR(用于尾随空格)
SELECT
LEFT(cust_name + space(60), 60),
LEFT(cust_address + space(60), 60),
答案 1 :(得分:3)
这是基于Jim的回答,
SELECT
@field_text + SPACE(@pad_length - LEN(@field_text)) AS RightPad
,SPACE(@pad_length - LEN(@field_text)) + @field_text AS LeftPad
优点
缺点
答案 2 :(得分:2)
最简单的用空格填充字符串(不修剪空格)的方法是将字符串简单地转换为CHAR(length)。 MSSQL有时会修剪VARCHAR中的空格(因为它是可变长度数据类型)。由于CHAR是固定长度的数据类型,因此SQL Server将永远不会修剪尾随空格,并且会自动用空格填充比其长度短的字符串。例如,请尝试以下代码片段。
SELECT CAST('Test' AS CHAR(20))
这将返回值'Test '
。
答案 3 :(得分:0)
基于KMier's answer,解决了当要填充的字段不是字段时该方法存在问题的注释,但是(可能是复杂的)函数的结果;整个功能必须重复。
此外,这允许将字段填充到其内容的最大长度。
WITH
cte AS (
SELECT 'foo' AS value_to_be_padded
UNION SELECT 'foobar'
),
cte_max AS (
SELECT MAX(LEN(value_to_be_padded)) AS max_len
)
SELECT
CONCAT(SPACE(max_len - LEN(value_to_be_padded)), value_to_be_padded AS left_padded,
CONCAT(value_to_be_padded, SPACE(max_len - LEN(value_to_be_padded)) AS right_padded;
答案 4 :(得分:0)
declare @t table(f1 varchar(50),f2 varchar(50),f3 varchar(50))
insert into @t values
('foooo','fooooooo','foo')
,('foo','fooooooo','fooo')
,('foooooooo','fooooooo','foooooo')
select
concat(f1
,space(max(len(f1)) over () - len(f1))
,space(3)
,f2
,space(max(len(f2)) over () - len(f2))
,space(3)
,f3
)
from @t
结果
foooo fooooooo foo
foo fooooooo fooo
foooooooo fooooooo foooooo