讨论:SQL函数 - 未知参数计数

时间:2016-06-02 14:27:24

标签: sql-server function

我想与您分享以下想法。

我非常喜欢“SQL功能”。 但是它们的缺点是,你需要解释所有的参数。

所以,如果我有一个功能。我需要添加更多参数。我需要找到他所有的召唤,并添加新参数。

我想决定任何一个函数,包含,比方说,10个参数,默认为所有未使用的参数。

就此而言,我有“MyFN”功能。她会这样表现出来:

create function MyFN(@I int, @S nvarchar(50), @D datetime, @P4 sql_variant = null, @P5 sql_variant = null, @P6 sql_variant = null, @P7 sql_variant = null, @P8 sql_variant = null, @P9 sql_variant = null, @P10 sql_variant = null)
returns int
as
begin
      return 1
end

我们会这样打电话给她:

select dbo.MyFN(1,'xxx',getdate(),default,default,default,default,default,default,default) -- => 1

现在我们需要添加一个新参数 - real。

现在功能就是这样:

alter function MyFN(@I int, @S nvarchar(50), @D datetime, @R real = 0, @P5 sql_variant = null, @P6 sql_variant = null, @P7 sql_variant = null, @P8 sql_variant = null, @P9 sql_variant = null, @P10 sql_variant = null)
returns int
as
begin
      if @R > 0
            return 2
      return 1
end

我们会打电话给她:

select dbo.MyFN(1,'xxx',getdate(),0.5,default,default,default,default,default,default) -- => 2

我们仍然可以像以前的方法一样打电话给她,并得到相同的答案。

我很想听听你对此事的看法!

你需要设置多少参数。

非常感谢!

2 个答案:

答案 0 :(得分:3)

不,不要这样做。为了简化可能的后续修改,您创建了一些不太可读的内容。此外,谁知道您以后的参数需要什么类型。

另一种方法是稍后使用额外参数创建一个新版本的函数,并将旧版本改为仅调用新函数。

答案 1 :(得分:0)

为什么不使用xml或其他文本结构类型?

CREATE FUNCTION [dbo].TEST ( @String XML )
RETURNS INT
AS
BEGIN
DECLARE @Z AS INT 
SELECT  @z=T.c.value('value[1]', 'int')
FROM @String.nodes('/Root') T(c)


RETURN @Z

END 
GO
SELECT DBO.TEST('<Root><value>5</value></Root>')

可能不是超级快但是非常灵活