【问题标题】:Function that returns multiple columns返回多列的函数
【发布时间】:2015-08-28 12:40:14
【问题描述】:

我正在创建一个拆分字符串的函数。我想将函数传递给一个字符串并取回几行(行数将是动态的,具体取决于字符串的长度)。

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

要求为我编写此内容,我只是想知道这在 SQL Server 2014 中是否可行,如果可行,最好的方法是什么。

所以字符串 'ABC' 将返回为:

COL1  COL2  COL3
A      B    C

【问题讨论】:

  • 是的 - 它被称为Table-valued function
  • 是的,这就是我一直在看的,我在上面提到过。是否可以用于拆分字符串并在单独的列中动态返回每个字符?
  • 否 - 列必须是静态的。不过,您可以返回多个 - 请参阅我的答案。
  • @DStanley 当然可以,但你可能需要动态 SQL。
  • @SQLPolice 当然不能——不是来自表值函数。它返回的列是定义的一部分。来自MSDN:“RETURNS 子句还定义了表格的格式。”

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


【解决方案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)

【讨论】:

    【解决方案2】:

    我只是想知道这在 SQL Server 2014 中是否可行

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

    所以字符串 'ABC' 将返回为:

    COL1  COL2  COL3
    A      B    C
    

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

    Item  Value
    1     A
    2     B
    3     C
    

    【讨论】:

    • 也许作为行返回然后应用动态枢轴可以得到我想要的结果。这将是可怕的......
    • 是的,动态轴也不好玩。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    相关资源
    最近更新 更多