【问题标题】:Infinite optional parameters无限可选参数
【发布时间】:2013-09-03 00:19:06
【问题描述】:

本质上,我希望能够创建一个标量函数,该函数接受可变数量的参数并将它们连接在一起以返回单个 VARCHAR。换句话说,我希望能够在不确定数量的变量上创建折叠并将折叠的结果作为 VARCHAR 返回,类似于 C# 中的 .Aggregate 或 Common Lisp 中的 Concatenate。

我的这种函数的(程序)伪代码如下:

  1. 定义一个 VARCHAR 变量
  2. foreach 非空参数将其转换为 VARCHAR 并将其添加到 VARCHAR 变量中
  3. 返回 VARCHAR 变量作为函数的结果

在 MS-SQL 中是否有一种惯用的方式来做这样的事情? MS-SQL Server 是否有任何类似于 C# 参数/Common Lisp &rest 关键字的东西?

-- 编辑--

是否可以在不使用表值参数的情况下执行类似的操作,从而使函数调用如下所示:

MY_SCALAR_FUNC('A', NULL, 'C', 1)

而不是每次调用函数时都必须经历设置和插入新临时表的麻烦?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    对于一组项目,您可以考虑将值表传递给您的函数吗?

    Pass table as parameter into sql server UDF

    另见http://technet.microsoft.com/en-us/library/ms191165(v=sql.105).aspx

    要直接回答您的问题,不,没有 params 关键字的等价物。我使用的方法是上面的方法 - 创建一个用户定义的表类型,为每个值填充一行,然后将其传递给您的标量函数以进行操作。

    编辑:如果您想避免使用表参数,并且使用 SQL 2012,请查看 CONCAT 函数:

    http://technet.microsoft.com/en-us/library/hh231515.aspx

    CONCAT ( string_value1, string_value2 [, string_valueN ] )
    

    这仅适用于内置的 CONCAT 函数,您不能使用“params”样式声明滚动您自己的函数。

    【讨论】:

    • 对不起,我应该更清楚。我特别希望避免使用表值参数,我会更新问题以使其更清晰。
    • @BenH 我在一个选项中编辑,仅适用于字符串连接,如果有帮助也仅适用于 SQL 2012?
    • 这确实有帮助,谢谢梅夫。这让我想知道他们是如何实现该功能的。我们没有在这个特定项目中使用 2012,但我们在其他项目上使用,我不知道该功能,所以谢谢。
    • 经过更多搜索,您的答案似乎是正确的。不幸的是,MSFT 似乎没有向我们其他人提供 2012 年 CONCAT 中使用的 params 实现。我将你标记为正确答案。
    • 8年后我要来了...只是好奇...内置的“COALESCE”功能是如何创建的?它可以接受无限参数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2015-11-17
    • 2021-09-28
    相关资源
    最近更新 更多