在列中拆分和复制字符串值的单一查询方法

ent*_*ton 0 sql-server-2008 sql-server substring

这是我之前问题的一部分。

我有以下逻辑从表中的列中拆分字符串值tblProjects,如下所示:

SELECT  @Docs = Documents FROM tblProjects WHERE ID = @ID 
SET @Docs = @Docs + '$'
SET @pos = 0
SET @len = 0

WHILE CHARINDEX('$', @Docs, @pos + 1)>0
BEGIN
  SET @len = CHARINDEX('$', @Docs, @pos + 1) - @pos
  SET @value = SUBSTRING(@Docs, @pos, @len)

  IF CHARINDEX('|', @value) >0
  BEGIN
    SELECT  @type = SUBSTRING(@value, 1, CHARINDEX('|', @value) - 1),
            @name = SUBSTRING(@value, CHARINDEX('|', @value) + 1, 200)
    INSERT INTO tblDocuments VALUES(@ID, @value, @type, @name)
  END   

  SET @pos = CHARINDEX('$', @Docs, @pos + @len) +1
END
Run Code Online (Sandbox Code Playgroud)

示例输入将是

insert into tblProjects(ID, Documents) 
values('P_1', 'gdgfg|jkkgk$bkgkkj|kjgkgk$vjffj|Khkgjhg$jkgkvghv|kbkghhkgk');
Run Code Online (Sandbox Code Playgroud)

我需要拆分Documents字符串并将值插入到单独的表中。由 分隔的值|应进入同一行的单独列,而特定行的值由 分隔$

对于表中的所有行,是否有一种查询方法可以在尽可能短的时间内完成此操作?

Mik*_*son 5

您应该使用拆分字符串功能。

select left(S.Item, charindex('|', S.Item) - 1),
       stuff(S.Item, 1, charindex('|', S.Item), '')
from dbo.tblProjects as P
  cross apply dbo.SplitString(P.Documents, '$') as S;
Run Code Online (Sandbox Code Playgroud)

Aaron Bertrand 在博客中介绍了您在Split strings 中的一些替代方案,即正确的方式——或者下一个最好的方式