之前有提過一個方式來批量更新DB的資料,就是利用分隔符號把所有資料合併成單一字串,然後傳送此字串給SQL Server去轉換成表格做進階運用,今天就來看一下該如何利用此方式。
首先建立一個方法(Method)把要批量更新的資料組合成一個字串,你可以建立屬於自己的方法,這邊我用下面的範例說明。
01 public static string JoinList<T>(string delimiter, IEnumerable<T> items, Converter<T, string> converter)
02 {
03 StringBuilder builder = new StringBuilder();
04 foreach (T item in items)
05 {
06 builder.Append(converter(item));
07 builder.Append(delimiter);
08 }
09 if (builder.Length > 0)
10 builder.Length = builder.Length - delimiter.Length;
11
12 return builder.ToString();
13 }
02 {
03 StringBuilder builder = new StringBuilder();
04 foreach (T item in items)
05 {
06 builder.Append(converter(item));
07 builder.Append(delimiter);
08 }
09 if (builder.Length > 0)
10 builder.Length = builder.Length - delimiter.Length;
11
12 return builder.ToString();
13 }
此方法可以接受不同的資料型態然後轉成字串輸出,其使用方法如下:
List<int> lstCustomerID = new List<int> { 1001, 1002, 1003, 1004 };
//使用","作為分隔字元,輸入的資料型態為int
string strParameter = JoinList<int>(",", lstCustomerID, delegate(int item) { return item.ToString(); });
//使用","作為分隔字元,輸入的資料型態為int
string strParameter = JoinList<int>(",", lstCustomerID, delegate(int item) { return item.ToString(); });
幫然也可以輸入其他的資料型態如下
//一樣建立一個List<Guid>物件
List<Guid> lstCustomerID = new List<Guid> { guid1, guid2, ... };
//使用","作為分隔字元,輸入的資料型態為Guid
string strParameter = JoinList<Guid>(",", lstCustomerID, delegate(Guid item) { return item.ToString(); });
List<Guid> lstCustomerID = new List<Guid> { guid1, guid2, ... };
//使用","作為分隔字元,輸入的資料型態為Guid
string strParameter = JoinList<Guid>(",", lstCustomerID, delegate(Guid item) { return item.ToString(); });
此字串內容會是這樣
1001,1002,1003,1004
將此字串送入後端的SQL資料庫後,資料庫需要有function把此字串轉成資料表以利運用,下面是一個範例如何將此類字串轉成table。
01 CREATE FUNCTION dbo.fxnParseCommaDelmitedList
02 (
03 @CommaDelimitedList varchar(8000)
04 )
05 RETURNS @TableVar TABLE (ItemID int NOT NULL )
06 AS
07 BEGIN
08 DECLARE @IDListPosition int
09 DECLARE @IDList varchar(4000)
10 DECLARE @ArrValue varchar(4000)
11 SET @IDList = COALESCE(@CommaDelimitedList, '')
12 IF @IDList <> ''
13 BEGIN
14 --先在字串最後補上一個','
15 SET @IDList = @IDList + ','
16 WHILE PATINDEX('%,%' , @IDList ) <> 0
17 BEGIN
18 SELECT @IDListPosition = PATINDEX('%,%' , @IDList)
19 SELECT @ArrValue = LEFT(@IDList, @IDListPosition - 1)
20 --將分割後的數值存入@TableVar
21 INSERT INTO @TableVar (ItemID) VALUES (CONVERT(int, @ArrValue))
22 --將已經處理過的字串移除
23 SELECT @IDList = STUFF(@IDList, 1, @IDListPosition, '')
24 END
25 END
26 RETURN
27 END
02 (
03 @CommaDelimitedList varchar(8000)
04 )
05 RETURNS @TableVar TABLE (ItemID int NOT NULL )
06 AS
07 BEGIN
08 DECLARE @IDListPosition int
09 DECLARE @IDList varchar(4000)
10 DECLARE @ArrValue varchar(4000)
11 SET @IDList = COALESCE(@CommaDelimitedList, '')
12 IF @IDList <> ''
13 BEGIN
14 --先在字串最後補上一個','
15 SET @IDList = @IDList + ','
16 WHILE PATINDEX('%,%' , @IDList ) <> 0
17 BEGIN
18 SELECT @IDListPosition = PATINDEX('%,%' , @IDList)
19 SELECT @ArrValue = LEFT(@IDList, @IDListPosition - 1)
20 --將分割後的數值存入@TableVar
21 INSERT INTO @TableVar (ItemID) VALUES (CONVERT(int, @ArrValue))
22 --將已經處理過的字串移除
23 SELECT @IDList = STUFF(@IDList, 1, @IDListPosition, '')
24 END
25 END
26 RETURN
27 END
建立上面這個function並放在Table-Valued的資料夾下即可。
使用方式:
Select *
From dbo.fxnParseCommaDelmitedList(@parameter)
From dbo.fxnParseCommaDelmitedList(@parameter)
就會得到如下的表格
ItemID |
1001 |
1002 |
1003 |
1004 |