LTRIM和RTRIM分別可以去掉資料左邊和右邊的空白字元,
如下述的範例,因為已知firstName和lastName可能右邊有空白字元,
所以使用RTRIM把空白字元去掉。

DECLARE @firstName NVARCHAR(50), @lastName NVARCHAR(50)
SET @firstName = 'Grady'
SET @lastName = 'Li         '

--沒有使用RTRIM()
SELECT 'My name is ' + @firstName + ' ' + @lastName + '. Nice to meet you.'
--結果如下
--My name is Grady Li         . Nice to meet you.

--使用RTRIM()
SELECT 'My name is ' + RTRIM(@firstName) + ' ' + RTRIM(@lastName) + '. Nice to meet you.'
--結果如下
--My name is Grady Li. Nice to meet you.

可是如果資料的內容有可能是NULL時,LTRIM和RTRIM執行的結果,
就不是我們所預期的。

例如使用者誤把所有資料填入firstName,而lastName則是資料庫預設的NULL。

DECLARE @firstName NVARCHAR(50), @lastName NVARCHAR(50)
SET @firstName = 'Grady Li     '
SET @lastName = NULL

SELECT 'My name is ' + RTRIM(@firstName) + ' ' + RTRIM(@lastName) + '. Nice to meet you.'
--結果如下
--NULL

其實往深一層探討,會出現這樣的情況,
是在於字串相加的規則中,對於NULL的處理所產生的問題。
字串使用「+」串聯時,如果其中有一個值是NULL,則結果為NULL。[1]

要解決這個問題的方法有兩種。
方法一,
針對當下的SESSION改變NULL處理的預設值,如下範例。

SET CONCAT_NULL_YIELDS_NULL OFF;
GO

DECLARE @firstName NVARCHAR(50), @lastName NVARCHAR(50)
SET @firstName = 'Grady Li     '
SET @lastName = NULL

SELECT 'My name is ' + RTRIM(@firstName) + ' ' + RTRIM(@lastName) + '. Nice to meet you.'
--結果如下
--My name is Grady Li . Nice to meet you.

這是利用CONCAT_NULL_YIELDS_NULL讓NULL結果不會輸出。

但是官方文件已經備註,此功能未來將鎖定為ON,使用者無法變更。
也就是不建議使用此解決方式。
[2]

方法二,
使用COALESCE將NULL取代為空字串(不是空白字串)。
其實COALESCE並不是取代NULL;
而是它會回傳參數中,第一個非NULL的參數。[3]

範例如下,

DECLARE @firstName NVARCHAR(50), @lastName NVARCHAR(50)
SET @firstName = 'Grady Li     '
SET @lastName = NULL

SELECT 'My name is ' + COALESCE(RTRIM(@firstName), '')
	+ ' ' + COALESCE(RTRIM(@lastName), '') + '. Nice to meet you.'
--結果如下
--My name is Grady Li . Nice to meet you.

也就是COALESCE會去判斷我們傳進去的參數,
如果第一個參數不是NULL,就回傳。
如果第一個參數是NULL,就判斷第二個參數,以此類推。

以上,做為記錄。

參考文章
1. http://msdn.microsoft.com/en-us/library/ms177561.aspx
2. http://msdn.microsoft.com/en-us/library/ms176056(v=SQL.105).aspx
3. http://msdn.microsoft.com/en-us/library/ms190349.aspx