2014-01-15 22 views
1

我已經定義了一個UDF,它根據我提供的類型將某個字符串拆分爲多個子字符串。在SQL中使用用戶定義的函數根據2個參數返回表

ALTER FUNCTION Split (@MainString varchar(100), @Type char) 
RETURNS @PartsTable TABLE 
(
    C1  varchar(10) NULL, 
    C2  varchar(10) NULL, 
    C3  varchar(50) NULL, 
    C4  varchar(10) NULL, 
    C5  varchar(50) NULL 
) 
AS 
BEGIN  
    declare @pC1 as varchar(10) 
    declare @pC2 as varchar(10) 
    declare @pC3 as varchar(50) 
    declare @pC4 as varchar(10) 
    declare @pC5 as varchar(50) 

    -- cut string into pieces 
    /* 
    do some work 
    */ 

    -- fill return table 
    INSERT @PartsTable (C1, C2, C3, C4, C5) 
      select @pC1, @pC2, @pC3, @pC4, @pC5 
    RETURN 
END 

它爲我提供了正確的結果集:

C1  C2  C3  C4  C5 
-------------------------------------- 
M.C. NULL Test NULL NULL 

(1 row(s) affected) 

當我這樣稱呼它:

SELECT * 
FROM dbo.[Split]('Test M.C.', 'X') 

我怎麼能在一個正常的SQL查詢結合這一點,我是想一個表格如下所示;

SELECT * 
FROM MyTable X, dbo.Split(X.ColumnString, X.Type) 

但這並不奏效。它給我提供了以下錯誤:

Msg 4121, Level 16, State 1, Line 7
Cannot find either column "dbo" or the user-defined function or aggregate "dbo.SplitsKlantNaam_T1", or the name is ambiguous.

有誰知道我該怎麼稱呼這個UDF?

在此先感謝。

回答

2

在這種情況下使用CROSS APPLY,例如,

select * 
    from MyTable X cross apply dbo.Split(X.ColumnString, X.Type); 

SqlFiddle here

+0

非常感謝!從未聽說過交叉應用方法。 Superstuff :) – Obelix

0

這happend因爲函數返回一個表,所以你應該把功能表

select * from [dbo].[Split] ('karim pentest') 

[dbo].[Split] : is the name of my function 
相關問題