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上寻找任何提示 我还尝试使用一组非常简化的函数,但无法使其工作