SQL服务器:用户自定义函数参数

SQL Server: user defined function parameter

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

本质上,我想传递一个参数,然后在 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 ','

正如 Alex K 所述,您不能将数组作为 SQL 函数的输入传递。您可以传递 table 类型 (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')