動態將多筆資料的特定欄位依分隔符號組成字串
實務上若要將多筆資料依照逗點或斜線等特定分隔符號組成單一欄位的字串(如下圖),
可能會寫這樣的TSQL敘述來完成這個需求,雖然可以解決問題,但只要要處理的TABLE或欄位改變,就得改寫TSQL,似乎缺乏彈性,
1: select @result = case when @result is null then NAME else @result + ',' + NAME end
2: from t
3: where ID='001'
為了增加可重用性,可以把要查詢的TABLE、SELECT的欄位以及篩選條件等可能的變數以參數方式來取代,搭配sp_executesql系統預存程序來重複執行TSQL敘述,最後將之建立為Stored Procedure來reuse,完整程式碼如下:
1: create procedure usp_GetListByCondition
2: (
3: @table_name varchar(50) = '', --欲查詢的TABLE名稱
4: @where_column varchar(50) = '', --篩選的欄位名稱
5: @where_value varchar(50) = '', --篩選的欄位值
6: @merge_column varchar(50) = '', --要合併的欄位
7: @splitter char(1) = '' --分隔符號
8: )
9: as
10: begin
11: --sp_executesql的第一個參數@statement必須是unicode參數或變數,所以宣告為nvarchar
12: declare @statement nvarchar(max) = N'
13: select @result = case when @result is null then ' + @merge_column + ' else @result + ''' + @splitter + ''' + ' + @merge_column + ' end
14: from ' + @table_name + '
15: where ' + @where_column + '=''' + @where_value + '''
16: '
17: --sp_executesql的第二個參數@parameters必須是unicode參數或變數,所以宣告為nvarchar
18: declare @parms nvarchar(max)= '@result varchar(max) output'
19: declare @list nvarchar(max)
20: execute sp_executesql @statement,@parms, @result = @list output
21: select @list
22: end
23:
24: go
下列程式碼範例為使用usp_GetListByCondition預存程序來進行多筆資料合併。
1: create table t
2: (
3: ID varchar(10)
4: ,NAME varchar(10)
5: )
6: go
7: create table t1
8: (
9: c1 varchar(10)
10: ,c2 varchar(10)
11: )
12: go
13:
14: insert into t values('001','aaa'),('001','bbb'),('001','cccc')
15: select *
16: from t
17: go
18:
19: insert into t1 values('001','AAA'),('001','BBB'),('001','CCC')
20: select *
21: from t1
22: go
23:
24: exec usp_GetListByCondition 't','ID','001','NAME',','
25: exec usp_GetListByCondition 't','ID','001','NAME','/'
26: exec usp_GetListByCondition 't1','c1','001','c2','/'
27: go
執行結果如下:
PS:上述程式碼尚有不足之處,例如必須在執行組字串前先檢查特定欄位及TABLE是否存在,以免發生錯誤。另外,本範例暫時不考慮效能問題。