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')
我想知道是否可以创建一个用户定义的函数,该函数可以采用不同长度的参数(以及其他参数)。
本质上,我想传递一个参数,然后在 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')