【问题标题】:SQL Server: user defined function parameterSQL Server:用户定义函数参数
【发布时间】:2016-11-25 05:01:33
【问题描述】:

我想知道是否可以创建一个用户定义的函数,该函数可以采用不同长度的参数(以及其他参数)。

本质上,我想传递一个参数,然后在IN 语句中使用该参数。我想做的是这样的:

CREATE FUNCTION ufnGetOpenNotificationValue 
    (@LegacyTypeID INT, 
     @MonthEnd DATE, 
     @YearStart DATE, 
     @YearEnd DATE)

@LegacyTypeID 是一个整数列表。

那么使用函数可能看起来像这样

SELECT RE_Auxiliary.dbo.ufnGetOpenNotificationValue
    ((1,2,3),'2014-07-31','2013-09-01','2014-08-31')

而不是

SELECT RE_Auxiliary.dbo.ufnGetOpenNotificationValue
        (1,'2014-07-31','2013-09-01','2014-08-31') + 
    RE_Auxiliary.dbo.ufnGetOpenNotificationValue
        (2,'2014-07-31','2013-09-01','2014-08-31') + 
    RE_Auxiliary.dbo.ufnGetOpenNotificationValue
        (3,'2014-07-31','2013-09-01','2014-08-31')

但如果我尝试传递多个整数,我会收到错误提示

Incorrect syntax near ','

【问题讨论】:

  • 表值参数 与你能得到的一样接近,例如Pass table as parameter into sql server UDF - 你不能传递可变参数。
  • 感谢@Alex K. - 我想我会坚持调用该函数 3 次并将它们相加,如果列表更长,我可能会考虑您提出的表格方法

标签: sql sql-server tsql user-defined-functions sqldatatypes


【解决方案1】:

正如 Alex K 所说,您不能将数组作为 SQL 函数的输入传递。您可以传递表格类型 (Pass table as parameter)。

CREATE TYPE TableType 
AS TABLE (LegacyTypeID INT)

CREATE FUNCTION ufnGetOpenNotificationValue 
(@LegacyTypeID TableType, 
 @MonthEnd DATE, 
 @YearStart DATE, 
 @YearEnd DATE)
...
WHERE COLUMN_NAME IN (SELECT LegacyType FROM @LegacyTypeID)

然后,您需要在调用函数之前插入 TableType 变量,并将该变量作为参数传递

另一种选择是将您的列表作为逗号分隔的值列表传入。然后使用一个函数 (like this one) 在你的 where 子句中使用

CREATE FUNCTION ufnGetOpenNotificationValue 
(@LegacyTypeID NVARCHAR(256), 
 @MonthEnd DATE, 
 @YearStart DATE, 
 @YearEnd DATE)
...
WHERE COLUMN_NAME in (SELECT val FROM dbo.f_split(@StringParameter, ','))

然后你可以这样调用:

SELECT RE_Auxiliary.dbo.ufnGetOpenNotificationValue
('1,2,3','2014-07-31','2013-09-01','2014-08-31')

【讨论】:

  • 感谢@Alex Fletcher,创建另一个函数来拆分逗号分隔列表似乎是一个优雅的解决方案,并且不像创建 Alex K 推荐的表值参数那样尴尬
猜你喜欢
  • 2018-06-30
  • 1970-01-01
  • 2019-06-10
  • 2011-12-28
  • 1970-01-01
相关资源
最近更新 更多