将表作为参数传递给函数
Posted
技术标签:
【中文标题】将表作为参数传递给函数【英文标题】:Pass Table as parameter to function 【发布时间】:2019-10-10 09:28:52 【问题描述】:我有一个临时表,其中包含选择所需的数据,但我无法加入主选择语句,因为它包含太多行,并且分组不够好。所以我决定在选择中直接使用我的临时表中的值,它工作正常。但是由于我需要从临时表中添加 50 次选择作为该主选择中的子查询,因此我正在考虑将其移动到函数中,因为调用函数 50 次比子查询更好。 我的问题是如何将该表中的值传递给函数?函数还将提供从该表中提取精确值所需的其他参数。我知道我不能将临时表作为参数传递,但是表变量呢?我不在乎我是使用临时表还是表变量.. 首先,我编写了一个包含与临时表相同的 select 语句的函数,它可以工作但速度太慢。因此,如果我可以将表格结果传递给函数,它将加快处理速度..
我的函数现在看起来像这样:
ALTER FUNCTION [document].[GetPersonPremium]
(
-- Add the parameters for the function here
@DocumentId bigint,
@PersonId bigint,
@PeriodId int,
@PersonRole nvarchar(20)
)
RETURNS DECIMAL (18,2)
AS
BEGIN
-- Declare the return variable here
DECLARE @premiumSum decimal (18,2)
-- Add the T-SQL statements to compute the return value here
set @premiumSum =
(select top 1 pt.Premium from document.Document d
inner join document.Person p on p.DocumentCalculationLayerID = dcl.DocumentCalculationLayerID
inner join document.PersonTasks pt on pt.PersonId = p.PersonId
inner join document.PersonCalculationHelper pch on pch.PersonTaskId = pt.PersonTaskId
inner join document.PersonTaskCalculationHelper ptch on ptch.PersonId = p.PersonId
inner join document.PersonMarkTypes pmt on pmt.ConcernMarkTypeID = ptch.ConcernMarkTypeId
where dcl.DocumentID = @DocumentId and p.PersonId = @PersonId and pch.PeriodId = @PeriodId and pmt.Name = @PersonRole)
-- Return the result of the function
RETURN @premiumSum
END
我想从这样的存储过程中使用它:
...
Engineer = Coalesce(document.GetPersonPremium(@DocumentId, p.PersonID, 65, 'Intern'), 0.00),
...
有什么建议吗?
【问题讨论】:
您能说明一下您使用的是哪个软件吗?你已经标记了 mysql 和 tsql。 T-SQL 用于 SQL Server 和 Sybase。 MySql 使用一种称为 MySql 的 SQL 方言。您发布的代码看起来像 T-SQL。 "我无法加入主选择语句,因为它包含太多行," . . .这没有任何意义。 @GordonLinoff - 在 SP 下面我有一个包含 60 多列和多个连接的大选择语句,需要从中为每个人返回一行,以及应用程序中期望这些值的对象。这就是我所说的主选择语句,其中需要将临时表中的过滤值与从连接中检索到的其他数据结合起来。 【参考方案1】:答案是针对那些因相同或相似问题来到此页面的人。 我创建了一个表类型:
CREATE TYPE PremiumTableType AS TABLE
(
PersonId bigint,
PeriodId int,
PersonRole nvarchar(20),
)
将其包含在函数中:
ALTER FUNCTION [document].[GetPersonPremium]
(
-- Add the parameters for the function here
@DocumentId bigint,
@PersonId bigint,
@PeriodId int,
@PersonRole nvarchar(20),
@PremiumTableType PremiumTableType readonly
)
RETURNS DECIMAL (18,2)
AS
BEGIN
-- Declare the return variable here
DECLARE @premiumSum decimal (18,2)
-- Add the T-SQL statements to compute the return value here
set @premiumSum = (select p.Premium from @PremiumType p where p.PersonId = @PersonId and p.PeriodId = @PeriodId and p.PersonRole = @PersonRole)
-- Return the result of the function
RETURN @premiumSum
END
在SP中声明的表类型变量
Declare @PremiumTableType PremiumTableType
从我的临时表中插入数据
Insert into @PremiumTableType (PersonID, PeriodId, ConcernRole, PersonPremium)
Select p.PersonID, ...
并从 SP 调用函数,如
document.GetPersonPremium(@DocumentID, p.PersonID, pt.PeriodID, 'Intern', @PremiumTableType)
【讨论】:
以上是关于将表作为参数传递给函数的主要内容,如果未能解决你的问题,请参考以下文章