Sql server 2008 使用命名参数调用内嵌TVF,正确的语法是什么?

Sql server 2008 使用命名参数调用内嵌TVF,正确的语法是什么?,sql-server-2008,tsql,sql-server-2008-r2,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

我试着用位置参数调用一个内嵌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
给出的错误类似于:

Msg 137,级别15,状态2,第23行必须声明标量变量 “@Param2”

Msg 102,15级,状态1,第24行“,”附近的语法不正确


我做错了什么?

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


是否有使用命名参数的原因?您需要定义所有参数,因此存储过程通常没有真正的好处。

真正的好处是我可以在TVF中更改参数顺序,而不会影响调用方。如果参数被命名,也更容易看到它们是什么,尽管我可以通过放置良好的内联注释获得相同的效果。@MichaelGoldshteyn抱歉,SQL Server.RE:“或任何函数”都不可能做到这一点。事实并非如此。标量UDF可以通过
EXEC
调用,并在这种情况下接受命名参数。@MartinSmith谢谢您的更正,我已经编辑了我的帖子!