为逗号分隔的字符串中的每个值创建一行

Eri*_*ckM 2 sql-server t-sql view sql-server-2014

我目前正在尝试从执行以下操作的表创建视图:

Table A
??????????????????????????????? 
? PART NUMBER ?   FILE NAME   ?
???????????????????????????????
?  PN0001-01  ?      FOO      ?
?  PN0002-01  ?      BAR      ?
?  PN0003-01  ?    FOO,BAR    ?
?  PN0004-01  ?  BAR,FOO,FOB  ?
???????????????????????????????
Run Code Online (Sandbox Code Playgroud)

创造

View B
??????????????????????????????? 
? PART NUMBER ?   FILE NAME   ?
???????????????????????????????
?  PN0001-01  ?      FOO      ?
?  PN0002-01  ?      BAR      ?
?  PN0003-01  ?      FOO      ?
?  PN0003-01  ?      BAR      ?
?  PN0004-01  ?      BAR      ?
?  PN0004-01  ?      FOO      ?
?  PN0004-01  ?      FOB      ?
???????????????????????????????
Run Code Online (Sandbox Code Playgroud)

因此,本质上,我需要从表 A 中获取记录并将它们插入到视图 B 中,如果来自 A 的记录具有 LIKE '[,]' 属性,则该字段在 B 中被拆分为多个记录,具体取决于数量出现 ',' 的次数,每个 ',' 之间的文本在视图 B 中都有自己的记录。

Aar*_*and 6

首先,创建一个字符串拆分函数:

CREATE FUNCTION dbo.SplitString
(
    @List      nvarchar(max),
    @Delimiter nvarchar(10)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
  RETURN 
  (
    WITH x(x) AS 
    (
      SELECT 1 UNION ALL SELECT x+1 FROM x 
      WHERE x < (LEN(@List))
    )
    SELECT Item = SUBSTRING(@List, x, 
      CHARINDEX(@Delimiter, @List + @Delimiter, x) - x)
    FROM x WHERE x <= CONVERT(INT, LEN(@List))
      AND SUBSTRING(@Delimiter + @List, x, 1) = @Delimiter  );
GO
Run Code Online (Sandbox Code Playgroud)

然后,您可以简单地将源与函数交叉应用:

DECLARE @x TABLE(PartNumber nvarchar(255), FileName nvarchar(max));

INSERT @x(PartNumber, FileName) VALUES
('PN0001-01','FOO'),
('PN0002-01','BAR'),
('PN0003-01','FOO,BAR'),
('PN0004-01','BAR,FOO,FOB');

-- INSERT dbo.ViewName(col1,col2)
SELECT x.PartNumber, f.Item
FROM @x AS x
CROSS APPLY dbo.SplitString(x.FileName, N',') AS f;
Run Code Online (Sandbox Code Playgroud)

在 SQL Server 2016 中,您可以使用本机STRING_SPLIT()函数。