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

Mic*_*eyn 8 t-sql sql-server-2008 sql-server-2008-r2

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

SELECT MyTable.Col1,
       (SELECT TvfColumn FROM ufnGetData(MyTable.Col1, MyTable.Col2)),
       MyTable.Col2
FROM MyTable
Run Code Online (Sandbox Code Playgroud)

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

SELECT MyTable.Col1,
       (SELECT TvfColumn FROM ufnGetData(@Param1=MyTable.Col1, @Param2=MyTable.Col2)),
       MyTable.Col2
FROM MyTable
Run Code Online (Sandbox Code Playgroud)

该函数看起来像:

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

给出类似于的错误:

消息137,级别15,状态2,行23必须声明标量变量"@Param2".

消息102,级别15,状态1,行24','附近的语法不正确.

我究竟做错了什么?

小智 8

表值用户定义函数不能被视为存储过程.调用它们时不使用命名参数,它是基于位置的.换句话说,你想做的事情是不可能的.

你有没有想要使用命名参数的原因?您需要定义所有参数,因此通常在存储过程中看不到真正的好处.

  • 真正的好处是我可以在不影响呼叫者的情况下更改TVF中的参数顺序.如果它们被命名,也可以更容易地看到参数是什么,尽管我可以通过良好放置的内联注释获得相同的效果. (8认同)
  • RE:"或任何功能".这不是真的.可以使用`EXEC`调用标量UDF,并在这种情况下接受命名参数. (4认同)