2014-02-19 86 views
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 

回答

0

我不認爲這是可能的。

我圍繞表值參數的文檔(TechNet)和周圍的任何提示web瀏覽。

我也嘗試使用一套非常簡化的功能集,無法使其工作。

相關問題