【问题标题】:SELECT result as parameter in user defined table-parameter functionSELECT 结果作为用户定义的表参数函数中的参数
【发布时间】:2014-05-31 06:32:32
【问题描述】:

我需要将SELECT结果作为用户定义的表参数函数(返回表)的参数传递:

CREATE FUNCTION
...

CREATE TABLE cities
(
    ID int identity not null primary key,
    name varchar(40) unique
)

SELECT ID as startID,FUNCTION( SELECT name FROM cities ) FROM cities WHERE ID=1

函数用于SELECT city 和ID=1FUNCTION 的结果,当参数是所有城市的选择时。 我需要在不将选择分配给变量的情况下执行此操作,因为我在 CTE 内使用此语句无法分配变量(如果可以,请告诉我 :) 但它在我的案例)

【问题讨论】:

  • 您好 :) 我尝试执行上述语句,但它拒绝了我的代码,因为它必须是内置函数。我还尝试使用从函数返回的 TABLE 变量进行 INNER JOIN - 它有效,但在 CTE 中无效。问题是在 CTE 中它不允许将选择作为参数传递给函数。

标签: sql sql-server function common-table-expression create-table


【解决方案1】:

根据所有证据,这是不可能的。

this Technet article 中的示例仅显示了在 Transact-SQL 批处理中使用表值参数的一种方法,这可能已经暗示没有其他方法。如您所见,它表明您需要声明和填充与例程中的参数相同的用户定义类型的表值变量,然后将该变量作为参数传递。

如果这还不够,我相信文章中的以下段落可以解释为什么需要使用变量:

Transact-SQL通过引用将表值参数传递给例程,以避免复制输入数据。

因此,在幕后,您的函数不会完全接受 set,而只会接受对其的 reference。您需要在脚本中创建该引用,这就是声明表值变量的用途。

然后是this (closed) Connect item

如果您想要/需要避免变量声明,您可能必须重新审视您的设计。如果您需要这方面的帮助,请发布一个问题,详细说明您的查询正在做什么,以便找到合适的替代方案。

【讨论】:

    【解决方案2】:

    尝试应用?

    SELECT c.ID, f.Name
    FROM cities c
    CROSS APPLY dbo.my_function(c.ID) f
    

    【讨论】:

    • 他们的功能是接受一个,而不是一个单一的标量值,所以这不是一个好的选择。
    • 此外,它们的函数是标量的,您正在展示调用表值函数的语法。
    • @AndriyM 只是为了澄清table valued function 并不意味着您将表作为参数传递给函数,而是将GET a table 作为返回值,afaik 标量和表值函数都可以采用表格作为参数
    • @DrCopyPaste:是的,OP 是一个带有表值参数的标量值函数,并且此答案中的查询是调用带有标量值参数的表值函数。这个区别就是我对这个答案的问题。
    • @AndriyM 啊,很好,我们澄清了这一点,我承认我很困惑 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多