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 中都有自己的记录。
首先,创建一个字符串拆分函数:
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()函数。