返回多个列的函数

时间:2015-06-12 13:19:51

标签: sql sql-server-2014 sql-function

我正在创建一个拆分字符串的函数。我想将函数传递给一个字符串并返回几行(根据字符串的长度,行的数量将是动态的。)

我在考虑使用表函数并将其加入到我的查询中。

要求为我编写这个,我只是想知道在SQL Server 2014中是否甚至可以实现这一点,以及如果它是最好的方法。

因此字符串'ABC'将返回为:

COL1  COL2  COL3
A      B    C

2 个答案:

答案 0 :(得分:2)

  

我只是想知道在SQL Server 2014中是否可以实现这一点

是的,您可以创建返回表值的table-valued user defined functions

  

因此字符串'ABC'将返回为:

COL1  COL2  COL3
A      B    C

好了,现在你遇到了麻烦 - 表值函数必须有一个预定义模式的返回值,所以你不能动态地设置列名。您可以将它们作为返回,但是:

Item  Value
1     A
2     B
3     C

答案 1 :(得分:1)

你没有提到你想在哪里应用这个,但有解决方案:

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)