SQL SERVER 一行按照某个由分隔符拼接的字段拆分成多行

数据库应用系统经常会遇到,某个字段存储通过分隔符来连接键值字符串,例如下表FileHistory 结构中列:Keywords

我们可能在某些业务场景下转换成以下形式:

首先,创建sql 函数,将拼接的字符串拆分成table

CREATE FUNCTION [dbo].[UF_SplitStringToTable](
    @sInputList VARCHAR(MAX) -- List of delimited items
  , @sDelimiter VARCHAR(20) = ',' -- delimiter that separates items
) RETURNS @List TABLE (item VARCHAR(50))

BEGIN
DECLARE @sItem VARCHAR(MAX)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
 BEGIN
 SELECT
  @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
  @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))

 IF LEN(@sItem) > 0
  INSERT INTO @List SELECT @sItem
 END

IF LEN(@sInputList) > 0
 INSERT INTO @List SELECT @sInputList -- Put the last item in
RETURN
END



GO

然后,利用cross apply 将表FileHistory  和由此表列:keywords 通过UF_SplitStringToTable(FileHistory.keywords)的派生表连接生成想要的拆分结果。

具体代码如下:

SELECT 
   t1.[Id]
  ,t1.[Keywords]
  ,t1.[FileName]
  ,t1.[FileExtension]
  ,t1.[CreatedUser]
  ,t1.[CreatedTime]
  ,t1.[ImportType] 
  ,i.item as keyword  
FROM FileHistory t1
OUTER APPLY UF_SplitStringToTable(t1.Keywords, ',') i 

成功执行代码后,返回如下结果:

 这样,就完成我们需要的结果啦~

2015,fighting for myself,my dear darling,my family, ~O(∩_∩)O~。

posted @ 2015-05-14 16:56  IT女汉纸  阅读(3301)  评论(0编辑  收藏  举报