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レポートは現在、最初の出力で展開されていますが、できる限り簡潔にしたいと思います。
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),
これは、ジムの答えに基づいています。
SELECT
@field_text + SPACE(@pad_length - LEN(@field_text)) AS RightPad
,SPACE(@pad_length - LEN(@field_text)) + @field_text AS LeftPad
長所
短所
文字列をスペースで右詰めする最も簡単な方法は、文字列をCHAR(length)としてキャストすることです。 MSSQLは、VARiable-lengthデータ型であるため、VARCHARから空白を削除することがあります。 CHARは固定長のデータ型であるため、SQL Serverは末尾のスペースを削除せず、その長さより短い文字列をスペースで自動的に埋め込みます。たとえば、次のコードスニペットを試してください。
SELECT CAST('Test' AS CHAR(20))
これは、値'Test '
を返します。
KMierの答え に基づいて、パディングされるフィールドがフィールドではなく(おそらく複雑な)関数の結果である場合、このメソッドが問題を引き起こすというコメントに対処します。機能全体を繰り返す必要があります。
また、これにより、フィールドをそのコンテンツの最大長までパディングできます。
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;