使用命名参数调用内联TVF,正确的语法是什么?

时间:2011-11-21 22:05:37

标签: sql-server-2008 tsql sql-server-2008-r2

我尝试使用位置参数调用内联TVF并且工作正常:

SELECT MyTable.Col1,
       (SELECT TvfColumn FROM ufnGetData(MyTable.Col1, MyTable.Col2)),
       MyTable.Col2
FROM MyTable

然后我尝试将参数命名为TVF并且它不解析:

SELECT MyTable.Col1,
       (SELECT TvfColumn FROM ufnGetData(@Param1=MyTable.Col1, @Param2=MyTable.Col2)),
       MyTable.Col2
FROM MyTable

该功能类似于:

CREATE FUNCTION dbo.ufnGetData
(   
    @Param1 INT,
    @Param2 INT
)
RETURNS TABLE 
AS
RETURN 
(
SELECT 
       blah blah blah AS TvfColumn
)
GO

给出类似的错误:

  

消息137,级别15,状态2,行23必须声明标量变量   “@参数2”。

     

Msg 102,Level 15,State 1,Line 24','。附近的语法不正确。

我做错了什么?

1 个答案:

答案 0 :(得分:8)

表值的用户定义函数不能像存储过程那样对待。调用它们时不使用命名参数,它是基于位置的。换句话说,你想做的事情是不可能的。

您是否有理由要使用命名参数?您需要定义所有参数,因此通常无法通过存储过程看到这些参数。