在SQL中使用用户定义的函数,返回基于2个参数的表

时间:2014-01-15 16:23:00

标签: sql sql-server select user-defined-functions

我已经定义了一个UDF,它根据我提供的类型将某个字符串拆分成多个子字符串。

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
  找不到列“dbo”或用户定义的函数或聚合“dbo.SplitsKlantNaam_T1”,或者名称不明确。

有谁知道我应该怎么称呼这个UDF?

提前致谢。

2 个答案:

答案 0 :(得分:2)

在这种情况下使用CROSS APPLY,例如

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

SqlFiddle here

答案 1 :(得分:0)

这是因为函数返回是一个表,所以你应该将函数视为表

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

[dbo].[Split] : is the name of my function