我想与您分享以下想法。
我非常喜欢“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
我们仍然可以像以前的方法一样打电话给她,并得到相同的答案。
我很想听听你对此事的看法!
你需要设置多少参数。
非常感谢!
答案 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>')
可能不是超级快但是非常灵活