Ich habe eine Kundentabelle, die ich verwenden möchte, um ein Parameterfeld in SSRS 2008 auszufüllen. Der cust_num
ist der Wert und die Verkettung von cust_name
und cust_addr
wird das Etikett sein. Die erforderlichen Felder aus der Tabelle sind:
cust_num int PK
cust_name char(50) not null
cust_addr char(50)
Die SQL lautet:
select cust_num, cust_name + isnull(cust_addr, '') address
from customers
Was gibt mir das in der Parameterliste:
FIRST OUTPUT - ACTUAL
1 cust1 addr1
2 customer2 addr2
Was ich erwartet habe, aber ich möchte:
SECOND OUTPUT - DESIRED
1 cust1 addr1
2 customer2 addr2
Was ich versucht habe:
select cust_num, rtrim(cust_name) + space(60 - len(cust_name)) +
rtrim(cust_addr) + space(60 - len(cust_addr)) customer
from customers
Was mir die erste Ausgabe gibt.
select cust_num, rtrim(cust_name) + replicate(char(32), 60 - len(cust_name)) +
rtrim(cust_addr) + replicate(char(32), 60 - len(cust_addr)) customer
Was mir auch die erste Ausgabe gibt.
Ich habe auch versucht, space()
durch char(32)
zu ersetzen und umgekehrt
Ich habe Variationen von substring
, left
, right
ausprobiert, alles ohne Erfolg.
Ich habe auch ltrim
und rtrim
an verschiedenen Stellen verwendet.
Der Grund für die 60 ist, dass ich die maximale Länge in beiden Feldern geprüft habe und es 50 ist und ich etwas Leerzeichen zwischen den Feldern haben möchte, auch wenn das Feld maximal ist. Ich bin nicht wirklich besorgt über abgeschnittene Daten, da Stadt, Bundesland und Postleitzahl in verschiedenen Feldern liegen. Wenn also das Ende der Straße abgeschnitten ist, ist es in Ordnung, denke ich.
Dies ist kein Show-Stopper. Der SSRS-Bericht wird derzeit mit der ersten Ausgabe bereitgestellt. Ich würde ihn jedoch gerne sauberer machen, wenn ich kann.
Whammo Blammo (für führende Räume):
SELECT
RIGHT(space(60) + cust_name, 60),
RIGHT(space(60) + cust_address, 60)
ODER (für nachgestellte Leerzeichen)
SELECT
LEFT(cust_name + space(60), 60),
LEFT(cust_address + space(60), 60),
Dies basiert auf Jims Antwort,
SELECT
@field_text + SPACE(@pad_length - LEN(@field_text)) AS RightPad
,SPACE(@pad_length - LEN(@field_text)) + @field_text AS LeftPad
Vorteile
Nachteile
Die einfachste Möglichkeit, eine Zeichenfolge mit Leerzeichen (ohne sie zu beschneiden) mit der rechten Maustaste zu füllen, besteht darin, die Zeichenfolge einfach als CHAR (length) umzuwandeln. MSSQL schneidet manchmal Leerzeichen von VARCHAR ab (da es sich um einen Datentyp mit variabler Länge handelt). Da es sich bei CHAR um einen Datentyp mit fester Länge handelt, schneidet SQL Server die nachgestellten Leerzeichen niemals ab und füllt Zeichenfolgen, die kürzer als seine Länge sind, automatisch mit Leerzeichen auf. Versuchen Sie beispielsweise den folgenden Codeausschnitt.
SELECT CAST('Test' AS CHAR(20))
Dies gibt den Wert 'Test '
zurück.
Basierend auf der Antwort von KMier wird der Kommentar angesprochen, dass diese Methode ein Problem darstellt, wenn das aufzufüllende Feld kein Feld ist, sondern das Ergebnis einer (möglicherweise komplizierten) Funktion; Die gesamte Funktion muss wiederholt werden.
Dies ermöglicht auch das Auffüllen eines Felds auf die maximale Länge seines Inhalts.
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;