returns 多列的函数
Function that returns multiple columns
我正在创建一个拆分字符串的函数。我想将该函数传递给一个字符串并返回几行(行数将根据字符串的长度而变化)。
我正在考虑可能使用 table 函数并将其加入我的查询。
我不是要求为我写这篇文章,我只是想知道这在 SQL Server 2014 中是否可行,最好的方法是什么如果是的话。
所以字符串 'ABC' 将返回为:
COL1 COL2 COL3
A B C
I am simply wondering if this is even possible in SQL Server 2014
是的,您可以创建 table-valued user defined functions
return,嗯,一个 table 值。
So the string 'ABC' would be returned as:
COL1 COL2 COL3
A B C
好吧,现在你有麻烦了 - table 值函数必须有一个 return 值和 预定义模式 ,所以你无法动态 设置列名。您可以 return 那些 行 ,但是:
Item Value
1 A
2 B
3 C
你没有提到你想在哪里应用它,但有解决方案:
DECLARE @t TABLE(id int, n VARCHAR(50))
INSERT INTO @t VALUES
(1, 'ABCDEF'),
(2, 'EFGHIJKLMNOPQ')
;WITH cte AS
(SELECT id, n, SUBSTRING(n, 1, 1) c, 1 AS ind FROM @t
UNION ALL
SELECT id, n, SUBSTRING(n, ind + 1, 1), ind + 1 FROM cte WHERE LEN(n) > ind
)
SELECT *
FROM cte
PIVOT (MAX(c) FOR ind IN([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[12],[13],[14],[15])) p
输出:
id n 1 2 3 4 5 6 7 8 9 10 12 13 14 15
1 ABCDEF A B C D E F NULL NULL NULL NULL NULL NULL NULL NULL
2 EFGHIJKLMNOPQ E F G H I J K L M N P Q NULL NULL
这里是动态版:
DECLARE @l INT, @c VARCHAR(MAX) = ''
SELECT @l = MAX(LEN(n)) FROM PivotTable
WHILE @l > 0
BEGIN
SET @c = ',[' + CAST(@l AS VARCHAR(MAX)) + ']' + @c
SET @l = @l - 1
END
SET @c = STUFF(@c, 1, 1,'')
DECLARE @s NVARCHAR(MAX) = '
;WITH cte AS
(SELECT id, n, SUBSTRING(n, 1, 1) c, 1 AS ind FROM PivotTable
UNION ALL
SELECT id, n, SUBSTRING(n, ind + 1, 1), ind + 1 FROM cte WHERE LEN(n) > ind
)
SELECT *
FROM cte
PIVOT (MAX(c) FOR ind IN(' + @c + ')) p'
EXEC (@s)
我正在创建一个拆分字符串的函数。我想将该函数传递给一个字符串并返回几行(行数将根据字符串的长度而变化)。
我正在考虑可能使用 table 函数并将其加入我的查询。
我不是要求为我写这篇文章,我只是想知道这在 SQL Server 2014 中是否可行,最好的方法是什么如果是的话。
所以字符串 'ABC' 将返回为:
COL1 COL2 COL3
A B C
I am simply wondering if this is even possible in SQL Server 2014
是的,您可以创建 table-valued user defined functions
return,嗯,一个 table 值。
So the string 'ABC' would be returned as:
COL1 COL2 COL3 A B C
好吧,现在你有麻烦了 - table 值函数必须有一个 return 值和 预定义模式 ,所以你无法动态 设置列名。您可以 return 那些 行 ,但是:
Item Value
1 A
2 B
3 C
你没有提到你想在哪里应用它,但有解决方案:
DECLARE @t TABLE(id int, n VARCHAR(50))
INSERT INTO @t VALUES
(1, 'ABCDEF'),
(2, 'EFGHIJKLMNOPQ')
;WITH cte AS
(SELECT id, n, SUBSTRING(n, 1, 1) c, 1 AS ind FROM @t
UNION ALL
SELECT id, n, SUBSTRING(n, ind + 1, 1), ind + 1 FROM cte WHERE LEN(n) > ind
)
SELECT *
FROM cte
PIVOT (MAX(c) FOR ind IN([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[12],[13],[14],[15])) p
输出:
id n 1 2 3 4 5 6 7 8 9 10 12 13 14 15
1 ABCDEF A B C D E F NULL NULL NULL NULL NULL NULL NULL NULL
2 EFGHIJKLMNOPQ E F G H I J K L M N P Q NULL NULL
这里是动态版:
DECLARE @l INT, @c VARCHAR(MAX) = ''
SELECT @l = MAX(LEN(n)) FROM PivotTable
WHILE @l > 0
BEGIN
SET @c = ',[' + CAST(@l AS VARCHAR(MAX)) + ']' + @c
SET @l = @l - 1
END
SET @c = STUFF(@c, 1, 1,'')
DECLARE @s NVARCHAR(MAX) = '
;WITH cte AS
(SELECT id, n, SUBSTRING(n, 1, 1) c, 1 AS ind FROM PivotTable
UNION ALL
SELECT id, n, SUBSTRING(n, ind + 1, 1), ind + 1 FROM cte WHERE LEN(n) > ind
)
SELECT *
FROM cte
PIVOT (MAX(c) FOR ind IN(' + @c + ')) p'
EXEC (@s)