Sql 返回多列的函数

Sql 返回多列的函数,sql,sql-server-2014,sql-function,Sql,Sql Server 2014,Sql Function,我正在创建一个拆分字符串的函数。我想将函数传递给一个字符串,然后返回几行(行的数量将根据字符串的长度而动态变化) 我在考虑可能使用一个表函数并将其连接到我的查询中 我不是要求为我写这篇文章,我只是想知道这在SQL Server 2014中是否可能,如果可能的话,最好的方法是什么 因此字符串“ABC”将返回为: COL1 COL2 COL3 A B C COL1 COL2 COL3 A B C 我只是想知道这在SQL Server 2014中是否可行 是

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

我在考虑可能使用一个表函数并将其连接到我的查询中

我不是要求为我写这篇文章,我只是想知道这在SQL Server 2014中是否可能,如果可能的话,最好的方法是什么

因此字符串“ABC”将返回为:

COL1  COL2  COL3
A      B    C
COL1  COL2  COL3
A      B    C
我只是想知道这在SQL Server 2014中是否可行

是的,你可以创建一个返回值,一个表值

因此字符串“ABC”将返回为:

COL1  COL2  COL3
A      B    C
COL1  COL2  COL3
A      B    C
好了,现在您遇到了麻烦-表值函数必须有一个带有预定义模式的返回值,因此不能动态设置列名。但是,您可以将其作为行返回:

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

是的,你可以创建一个返回值,一个表值

因此字符串“ABC”将返回为:

COL1  COL2  COL3
A      B    C
COL1  COL2  COL3
A      B    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)

您没有提到要将此应用于何处,但有以下解决方案:

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)

是的,它叫a。是的,这就是我一直在看的,我在上面提到过。它是否可以用于拆分字符串并动态返回单独列中的每个字符?否-列必须是静态的。不过,您可以返回多行-请参阅我的答案。@DStanley当然可以,但您可能需要动态SQL。@SQLPolice当然不能-不能从表值函数返回。它返回的列是定义的一部分。From:“RETURNS子句还定义了表的格式。”是的,它被称为a。是的,这就是我一直在看的,我在上面提到过。它是否可以用于拆分字符串并动态返回单独列中的每个字符?否-列必须是静态的。不过,您可以返回多行-请参阅我的答案。@DStanley当然可以,但您可能需要动态SQL。@SQLPolice当然不能-不能从表值函数返回。它返回的列是定义的一部分。From:“RETURNS子句还定义了表的格式。”也许作为行返回然后应用动态透视可以得到我想要的结果。这将是可怕的…是的,动态轴也没有乐趣。也许返回为行,然后应用动态轴可以得到我想要的结果。这将是可怕的…是的,动态枢轴也没有乐趣。