Tsql 如何将SELECT的输出传递给需要表的函数?

Tsql 如何将SELECT的输出传递给需要表的函数?,tsql,Tsql,我有一个函数知道用逗号分割字符串: SELECT * FROM dbo.SplitStrings('15,29') DECLARE @table AS SmallStrings INSERT INTO @table VALUES ('a'),('b'),('c') SELECT dbo.JoinStrings(@table) Joined 返回 Item 15 29 Joined a,b,c Result 15,L 我还有一个知道用逗号连接字符串的函数: SELECT * FROM d

我有一个函数知道用逗号分割字符串:

SELECT * FROM dbo.SplitStrings('15,29')
DECLARE @table AS SmallStrings
INSERT INTO @table VALUES ('a'),('b'),('c')
SELECT dbo.JoinStrings(@table) Joined
返回

Item
15
29
Joined
a,b,c
Result
15,L
我还有一个知道用逗号连接字符串的函数:

SELECT * FROM dbo.SplitStrings('15,29')
DECLARE @table AS SmallStrings
INSERT INTO @table VALUES ('a'),('b'),('c')
SELECT dbo.JoinStrings(@table) Joined
返回

Item
15
29
Joined
a,b,c
Result
15,L
现在,我想拆分一个字符串,修改每个项目并将它们重新连接起来。我也能做到:

DECLARE @tmp SmallStrings
INSERT INTO @tmp SELECT dbo.DayOfMonthExprToCron2(Item) Item FROM dbo.SplitStrings('15,29')
SELECT dbo.JoinStrings(@tmp) Result
返回

Item
15
29
Joined
a,b,c
Result
15,L
现在我想知道是否可以将SELECT dbo.DayOfMonthExprToCron2Item项的结果从dbo.SplitStrings'15,29'直接传递到dbo.JoinStrings中

我尝试过,但失败了——我卑微的尝试甚至无法编译

天真的一个:

SELECT dbo.JoinStrings(SELECT dbo.DayOfMonthExprToCron2(Item) Item FROM dbo.SplitStrings('15,29')) Result
SELECT dbo.JoinStrings((SELECT dbo.DayOfMonthExprToCron2(Item) Item FROM dbo.SplitStrings('15,29'))) Result
导致

Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'SELECT'.
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ')'.
Msg 206, Level 16, State 2, Line 1
Operand type clash: nvarchar is incompatible with SmallStrings
编辑 再次尝试使用双括号:

导致

Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'SELECT'.
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ')'.
Msg 206, Level 16, State 2, Line 1
Operand type clash: nvarchar is incompatible with SmallStrings
我意识到代码是必要的,所以这里是:

CREATE FUNCTION [dbo].[SplitStrings](@List NVARCHAR(4000))
RETURNS TABLE
WITH SCHEMABINDING
AS
   RETURN 
   (  
      SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
      FROM ( 
        SELECT x = CONVERT(XML, '<i>' + REPLACE(@List, ',', '</i><i>') + '</i>').query('.')
      ) AS a 
      CROSS APPLY x.nodes('i') AS y(i)
   );

CREATE FUNCTION [dbo].[JoinStrings](@strings SmallStrings READONLY)
RETURNS NVARCHAR(4000)
AS
BEGIN
    DECLARE @res NVARCHAR(32) 
    SELECT @res = COALESCE(@res + ',', '') + Item 
    FROM @strings
    WHERE Item IS NOT NULL
    RETURN @res
END

CREATE TYPE [dbo].[SmallStrings] AS TABLE([Item] [nvarchar](5) NULL)

CREATE FUNCTION [dbo].[DayOfMonthExprToCron2](@dayOfMonthExpr NVARCHAR(32))
RETURNS NVARCHAR(32)
AS
BEGIN
    DECLARE @dayOfMonth INT = CAST(@dayOfMonthExpr AS INT)

    RETURN CASE WHEN @dayOfMonth < 29 THEN @dayOfMonthExpr ELSE 'L' END
END

我认为这是不可能的

我翻遍了表值参数的文档,并在web上寻找任何提示

我还尝试使用一组非常简化的函数,但无法使其工作