1
我有知道用逗號分割字符串的函數:如何將SELECT的輸出傳遞給期望表的函數?
SELECT * FROM dbo.SplitStrings('15,29')
返回
Item
15
29
我也有,知道用逗號加入字符串的函數:
DECLARE @table AS SmallStrings
INSERT INTO @table VALUES ('a'),('b'),('c')
SELECT dbo.JoinStrings(@table) Joined
返回
Joined
a,b,c
現在我想分割一個字符串,修改每個項目並將它們加入。我也可以這樣做:
DECLARE @tmp SmallStrings
INSERT INTO @tmp SELECT dbo.DayOfMonthExprToCron2(Item) Item FROM dbo.SplitStrings('15,29')
SELECT dbo.JoinStrings(@tmp) Result
返回
Result
15,L
現在我不知道我是否可以傳遞SELECT dbo.DayOfMonthExprToCron2(Item) Item FROM dbo.SplitStrings('15,29')
結果直接進入dbo.JoinStrings
我嘗試和失敗 - 我卑微的努力甚至不編譯。
天真之一:
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 ')'.
任何幫助結果表示讚賞。
編輯
另一個(使用雙括號)嘗試:
SELECT dbo.JoinStrings((SELECT dbo.DayOfMonthExprToCron2(Item) Item FROM dbo.SplitStrings('15,29'))) Result
結果
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