【问题标题】:Calling an in-line TVF with named parameters, what is the proper syntax?使用命名参数调用内联 TVF,正确的语法是什么?
【发布时间】:2012-01-03 09:15:39
【问题描述】:

我尝试使用位置参数调用内联 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, Level 15, State 2, Line 23 必须声明标量变量 “@Param2”。

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

我做错了什么?

【问题讨论】:

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


    【解决方案1】:

    不能将表值用户定义函数视为存储过程。在调用它们时不要使用命名参数,它是基于位置的。所以换句话说,你试图做的事情是不可能的。

    您为什么要使用命名参数有什么原因吗?您需要定义所有参数,因此您通常会看到存储过程没有真正的好处。

    【讨论】:

    • 真正的好处是我可以在不影响调用者的情况下更改 TVF 中的参数顺序。如果参数被命名,也更容易查看参数是什么,尽管我可以使用放置良好的内联 cmets 获得相同的效果。
    • @MichaelGoldshteyn 抱歉,SQL Server 无法实现。
    • RE:“或任何功能”。这不是真的。标量 UDF 可以使用 EXEC 调用,并在这种情况下接受命名参数。
    • @MartinSmith 感谢您的更正,我已经编辑了我的帖子!
    猜你喜欢
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    相关资源
    最近更新 更多