最近的工作中要幫使用者設定大量的系統參數,有陣子沒使用到資料列串接,一時之間失去了她的消息,這年頭忘記的比記得的多,重新拾回後快來點部落筆記,順便二探SQL Server 2016新功能: STRING_SPLIT:字串切割。
我們要的結果是下面的資料集
轉換成
German,Spain,France,Italy
同場加映SQL Server 2016推出的新table valued function(STRING_SPLIT),逆向轉換,也解決了T-SQL 組IN條件時可能被源碼檢測或程式分析工具檢測到的SQL Injection。
資料列轉換為逗號分隔字串
1.先準備環境
USE tempdb
CREATE TABLE UEFO_Country
(name varchar(30))
insert into UEFO_Country
values ('German'),('Spain'),('France'),('Italy')
ok!我們有了4個歐洲有舉辦歐冠小組賽的國家資料集
2.串接多筆資料列的語法(久不見若影,何竟日默默在此)
declare @String varchar(8000)
select @String = isnull(@String + ',', '') + cast(name as varchar(30))
FROM UEFO_Country
select @String
執行結果:
完成多筆資料列的串接~
複合字串拆解為多筆資料列
找回來舊愛,也要好好認識新歡,SQL Server 2016立馬內建: 複合字串切割
SELECT *
FROM STRING_SPLIT('England,Spain,Japan', ',')
輕鬆拆解
上面的國家名單是明年要旅行的地點,如果我們想要知道歐冠舉辦小組賽地點國家中,哪一個是我們明年剛好和旅行的?
好!來解決T-SQL IN條件用程式組字串出來的作法,直接用STRING_SPLIT串成資料集
SELECT NAME FROM UEFO_Country
WHERE NAME IN(SELECT *
FROM STRING_SPLIT('England,Spain,Japan', ',')
)
執行結果:
唯一支持西班牙!
小結:
- SQL Server 2016內建支援STRING_SPLIT,也可以用逗號、用分隔符號、用空白來拆解。
- 該出國旅行了。