SQL Server数据库函数中的新可选参数

时间:2018-06-13 17:42:47

标签: sql-server tsql

我有一个如下所示的存储过程:

CREATE FUNCTION [my_schema].[isEligible]
    (@product NUMERIC(8))
RETURNS INT
AS
BEGIN
    DECLARE @result INT;
    /* do eligibility checking, setting @result */
    RETURN @result;
END;

在几个与此类似的现有查询中引用了这个:

SELECT *
FROM person
WHERE my_schema.isEligible(?) > -1 -- negative numbers are eligibility error codes

其中?是给定产品ID的参数。

在调用该函数的几个查询之一中,我需要传入一个新的附加参数@exception。我希望函数默认情况下像以前一样运行,并且只改变将传递@exception值的一个调用的行为,所以我添加了新参数,如下所示:

CREATE FUNCTION [my_schema].[isEligible]
    (@product NUMERIC(8),
     @exception CHAR(1) = 'N')
RETURNS INT 
AS
BEGIN
    DECLARE @result INT;
    /*
    do eligibility checking (conditionally accounting for
    @exception being 'Y'), and setting @result 
    */
    RETURN @result;
END;

但是当我部署新版本的函数并运行只传入@product的查询时,我得到了An insufficient number of arguments were supplied for the procedure or function [my_schema].[isEligible]。我认为添加= 'N'会提供默认值并避免此问题。

我读过here,有时这个通用的声音错误实际上隐藏了其他不允许冒泡的错误,但我不知道是不是这样,因为它是在谈论程序,这是一个功能。不确定是否存在差异,或者函数是否不支持可选参数,例如过程。

如果可能的话,我很乐意不必为新参数传递NULL,这将简化该功能更新版本的推出。有没有办法像isEligible(?)isEligible(?, ?)那样调用此函数,还是需要第一个函数isEligible(?, NULL)才能使用它?

1 个答案:

答案 0 :(得分:1)

您可以将您的功能称为:

<script src="https://use.fontawesome.com/97dc0a8baa.js"></script>
<div class="contact-container">
    <div class="item">
        <div class="box">
            <div class="inner">
                <div class="copy"> <i class="fa fa-mobile-phone"></i>
                    <h3 class="sppb-addon-title sppb-feature-box-title sppb-media-heading"><a href="tel:+37068713383">+1 123 45 678 99</a></h3></div>
            </div>
        </div>
    </div>
    <div class="item">
        <div class="box">
            <div class="inner">
                <div class="copy"> <i class="fa fa-envelope-o"></i>
                    <h3 class="sppb-addon-title sppb-feature-box-title sppb-media-heading"> <span>info@info.com</span></h3></div>
            </div>
        </div>
    </div>
    <div class="item">
        <div class="box">
            <div class="inner">
                <div class="copy"> <i class="fa fa-map-marker"></i>
                    <h3 class="sppb-addon-title sppb-feature-box-title sppb-media-heading">City, Street 22</h3></div>
            </div>
        </div>
    </div>
    <div class="item">
        <div class="box">
            <div class="inner">
                <div class="copy"> <i class="fa fa-calendar"></i>
                    <h3 class="sppb-addon-title sppb-feature-box-title sppb-media-heading">I-V 09:00-17:00<br>&nbsp;VI 09:00-14:00<br>VII closed</h3></div>
            </div>
        </div>
    </div>
</div>

SELECT *
FROM person
WHERE my_schema.isEligible(?, default) > -1