前面提到了記錄合併,有了合併需求確定也會有分離需求,說到字符串分離,你們確定會想到SPLIT函數,這個在.NET,Java和JS中都有函數,很惋惜在SQL SERVER中沒有,咱們只能本身來寫這麼一個函數。函數
首先來分析一下怎麼寫這個函數,以以前合併的字符串爲例,「張三,李四,王五,錢六,趙七,Tom,Amy,Joe,Leo」,如今要將此字符串按照「,」進行分離獲得一組數據,如今能夠得出這個函數傳入變量有兩個,一個是目標字符串,咱們定義爲@string,數據類型爲nvarchar(500),選擇nvarchar()是爲了兼顧全部Unicode字符集,好比中文;另外一個變量爲分隔符,咱們定義爲@separator,數據類型爲nvarchar(10),輸出變量則定義爲@array,一個單列列名爲String,數據類型爲nvarchar(500)的Table。測試
下面來分析具體的拆分方法,以字符串「張三,李四,王五,錢六,趙七,Tom,Amy,Joe,Leo」爲例,首先得找到第一個「,」,而後把「張三」截取出來,而後將目標字符串變成「李四,王五,錢六,趙七,Tom,Amy,Joe,Leo」,而後再找第一個「,」,把「李四」截取出來,依次類推,直到找不到「,」,有了這個思路,下面就直接實現,查找字符串在程序語言中通常用indexOf方法,截取通常用Substring方法,SQL SERVER中有SUBSTRING函數用來截取字符串,可是沒有indexOf查找函數,取而代之的是CHARINDEX和PATINDEX函數,CHARINDEX用於徹底匹配查找,而PATINDEX用於模糊匹配查找,根據咱們的需求,選用CHARINDEX函數,整個SPLIT函數代碼以下:code
CREATE FUNCTION [dbo].[SPLIT] blog
( 字符串
-- Add the parameters for the function here get
@string nvarchar(500), string
@separator nvarchar(10) it
) io
RETURNS @array TABLE(String nvarchar(500)) function
AS
BEGIN
-- Declare the return variable here
DECLARE @separatorIndex int,@tempString nvarchar(500),@tagString nvarchar(500)
-- Add the T-SQL statements to compute the return value here
SET @tagString=@string
SET @separatorIndex=CHARINDEX(@separator,@tagString)
WHILE(@separatorIndex<>0)
BEGIN
SET @tempString = SUBSTRING(@tagString,1,@separatorIndex-1)
INSERT INTO @array(String) VALUES(@tempString)
SET @tagString = SUBSTRING(@tagString,@separatorIndex+1,LEN(@tagString)-@separatorIndex)
SET @separatorIndex=CHARINDEX(@separator,@tagString)
END
SET @tempString = @tagString
IF (LEN(@tempString)>0)
INSERT INTO @array(String) VALUES(@tagString)
-- Return the result of the function
RETURN
END
GO
接着測試一下:
SELECT * FROM dbo.SPLIT(N'張三,李四,王五,錢六,趙七,Tom,Amy,Joe,Leo',',')
能夠獲得以下結果: