Right pad une string avec un nombre variable d'espaces

J'ai une table de client que je veux employer pour peupler une boîte de paramètre dans SSRS 2008. Le cust_num est la valeur et la concaténation du cust_name et du cust_addr sera l'label. Les champs obligatoires de la table sont:

 cust_num int PK cust_name char(50) not null cust_addr char(50) 

Le SQL est:

 select cust_num, cust_name + isnull(cust_addr, '') address from customers 

Ce qui me donne ceci dans la list des parameters:

 FIRST OUTPUT - ACTUAL 1 cust1 addr1 2 customer2 addr2 

Ce qui est ce que j'attendais mais je veux:

 SECOND OUTPUT - DESIRED 1 cust1 addr1 2 customer2 addr2 

Ce que j'ai essayé:

 select cust_num, rsortingm(cust_name) + space(60 - len(cust_name)) + rsortingm(cust_addr) + space(60 - len(cust_addr)) customer from customers 

Ce qui me donne la première sortie.

 select cust_num, rsortingm(cust_name) + replicate(char(32), 60 - len(cust_name)) + rsortingm(cust_addr) + replicate(char(32), 60 - len(cust_addr)) customer 

Ce qui me donne aussi la première sortie.

J'ai aussi essayé de replace space() par char(32) et vice versa

J'ai essayé des variations de subssortingngsubssortingng , left , right tout en vain.

J'ai également utilisé lsortingm et rsortingm dans divers endroits.

La raison de la 60 est que j'ai vérifié la longueur maximale dans les deux champs et il est 50 et je veux des espaces entre les champs même si le champ est maxed. Les données tronquées ne m'inquiètent pas vraiment, car la ville, l'état et le code postal se trouvent dans des champs différents, donc si la fin de l'adresse de la rue est coupée, c'est correct, je suppose.

Ce n'est pas un bouchon de spectacle, le rapport SSRS est actuellement déployé avec la première sortie mais je voudrais le rendre plus propre si je le peux.

Whammo blammo (pour les espaces principaux):

 SELECT RIGHT(space(60) + cust_name, 60), RIGHT(space(60) + cust_address, 60) 

OU (pour les espaces de fin)

 SELECT LEFT(cust_name + space(60), 60), LEFT(cust_address + space(60), 60), 

Ceci est basé sur la réponse de Jim,

 SELECT @field_text + SPACE(@pad_length - LEN(@field_text)) AS RightPad ,SPACE(@pad_length - LEN(@field_text)) + @field_text AS LeftPad 

Avantages

  • Plus direct
  • Légèrement plus propre (IMO)
  • Plus rapide (peut-être?)
  • Facilement modifiable à l'un ou l'autre des deux tampons pour l'affichage dans les fonts de largeur non-fixe ou le remplissage de la fente gauche et droite au centre

Désavantages

  • Ne gère pas LEN (@field_text)> @pad_length

Basé sur la réponse de KMier , répond au commentaire que cette méthode pose un problème lorsque le champ à rembourrer n'est pas un champ, mais le résultat d'une fonction (éventuellement compliquée); la fonction entière doit être répétée.

En outre, cela permet de remplir un champ à la longueur maximale de son contenu.

 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;