sql-server - 避免在存储过程中重复函数?

标签 sql-server t-sql stored-procedures

我想在 WHERE 子句中使用 dbo.ret_udfCalculateDynamicReportHybridColumn 函数,但我必须避免在 SELECT 中重复该函数>WHERE 子句,如何解决问题?

这是我的存储过程:

ALTER PROCEDURE [dbo].[ret_FinancialVoucherArticles_GetArticles]
    (@CalculationGuid UNIQUEIDENTIFIER,
     @FinancialVoucherTypeGuid UNIQUEIDENTIFIER)
AS
    SELECT
        salaried.CostCenterGuid AS CostCenterEntityGuid,
        salaried.CostCenterCode,
        salaried.PersonGuid AS PersonEntityGuid,
        salaried.PersonCode,
        salaried.[Guid] AS SalariedEntityGuid,
        salaried.FinancialIdentifierCode,
        financial_VoucherArticleTemplates.ArticleNature,
        financial_VoucherArticleTemplates.[Description],
        financial_VoucherArticleTemplates.AccountCodePatternGuid,
        financial_VoucherArticleTemplates.AccountCodePattern,
        financial_VoucherTemplates.TargetDBGuid,
        financial_VoucherTemplates.FiscalYear,
        financial_VoucherTemplates.GroupingIdenticalArticle,
        calcs.[Guid] AS CalculationGuid,
        dbo.ret_udfCalculateDynamicReportHybridColumn(financial_VoucherArticleTemplates.ReferenceGuid) AS Amount
    FROM 
        [ret_payrollCalculations] calcs 
    INNER JOIN 
        [ret_PayrollCalculationInfo] info ON info.PayrollCalculationGuid = calcs.[Guid] 
    INNER JOIN 
        [ret_PayrollCalculationCommands] commands ON commands.[Guid] = calcs.[CalculationCommandGuid] 
    INNER JOIN 
        [ret_PayrollItemPatterns] patterns ON patterns.[Guid] = commands.[ItemPattern] 
    INNER JOIN 
        [ret_FinancialVoucherTemplateGroups] financialVoucherTemplateGroups ON financialVoucherTemplateGroups.[Guid] = patterns.[FinancialVoucherTemplateGroupGuid] 
    INNER JOIN 
        [ret_FinancialVoucherTemplateGroupsDetails] financialVoucherTemplateGroupsDetails ON financialVoucherTemplateGroupsDetails.[FinancialVoucherTemplateGroupGuid] = financialVoucherTemplateGroups.[Guid] AND financialVoucherTemplateGroupsDetails.[FinancialVoucherTypeGuid] = @FinancialVoucherTypeGuid 
    INNER JOIN 
        [gtw_Financial_VoucherTemplates] financial_VoucherTemplates ON financial_VoucherTemplates.[Guid] = financialVoucherTemplateGroupsDetails.[FinancialVoucherTemplateGuid] 
    INNER JOIN
        [gtw_Financial_VoucherArticleTemplates] financial_VoucherArticleTemplates ON financial_VoucherArticleTemplates.[VoucherTemplateGuid] = financial_VoucherTemplates.[Guid] 
    INNER JOIN 
        [ret_vwSalariedFull] salaried ON salaried.[Guid] = calcs.[SalariedGuid]
    WHERE
        calcs.[Guid] = @CalculationGuid 
        AND dbo.ret_udfCalculateDynamicReportHybridColumn(financial_VoucherArticleTemplates.ReferenceGuid) <> 0

最佳答案

使用 CTE 或子查询计算一次,并将结果列引用为 WHERE 过滤器和 SELECT 结果列:

;WITH Data AS
(
    SELECT
        salaried.CostCenterGuid AS CostCenterEntityGuid,
        salaried.CostCenterCode,
        salaried.PersonGuid AS PersonEntityGuid,
        salaried.PersonCode,
        salaried.[Guid] AS SalariedEntityGuid,
        salaried.FinancialIdentifierCode,
        financial_VoucherArticleTemplates.ArticleNature,
        financial_VoucherArticleTemplates.[Description],
        financial_VoucherArticleTemplates.AccountCodePatternGuid,
        financial_VoucherArticleTemplates.AccountCodePattern,
        financial_VoucherTemplates.TargetDBGuid,
        financial_VoucherTemplates.FiscalYear,
        financial_VoucherTemplates.GroupingIdenticalArticle,
        calcs.[Guid] AS CalculationGuid,
        dbo.ret_udfCalculateDynamicReportHybridColumn(financial_VoucherArticleTemplates.ReferenceGuid) AS Amount
    FROM 
        [ret_payrollCalculations] calcs INNER JOIN 
        [ret_PayrollCalculationInfo] info ON info.PayrollCalculationGuid = calcs.[Guid] INNER JOIN 
        [ret_PayrollCalculationCommands] commands ON commands.[Guid] = calcs.[CalculationCommandGuid] INNER JOIN 
        [ret_PayrollItemPatterns] patterns ON patterns.[Guid] = commands.[ItemPattern] INNER JOIN 
        [ret_FinancialVoucherTemplateGroups] financialVoucherTemplateGroups ON financialVoucherTemplateGroups.[Guid] = patterns.[FinancialVoucherTemplateGroupGuid] INNER JOIN 
        [ret_FinancialVoucherTemplateGroupsDetails] financialVoucherTemplateGroupsDetails ON financialVoucherTemplateGroupsDetails.[FinancialVoucherTemplateGroupGuid] = financialVoucherTemplateGroups.[Guid] AND financialVoucherTemplateGroupsDetails.[FinancialVoucherTypeGuid] = @FinancialVoucherTypeGuid INNER JOIN 
        [gtw_Financial_VoucherTemplates] financial_VoucherTemplates ON financial_VoucherTemplates.[Guid] = financialVoucherTemplateGroupsDetails.[FinancialVoucherTemplateGuid] INNER JOIN
        [gtw_Financial_VoucherArticleTemplates] financial_VoucherArticleTemplates ON financial_VoucherArticleTemplates.[VoucherTemplateGuid] = financial_VoucherTemplates.[Guid] INNER JOIN 
        [ret_vwSalariedFull] salaried ON salaried.[Guid] = calcs.[SalariedGuid]
    WHERE
        calcs.[Guid] = @CalculationGuid
)
SELECT
    D.CostCenterEntityGuid,
    D.CostCenterCode,
    D.PersonEntityGuid,
    D.PersonCode,
    D.SalariedEntityGuid,
    D.FinancialIdentifierCode,
    D.ArticleNature,
    D.Description,
    D.AccountCodePatternGuid,
    D.AccountCodePattern,
    D.TargetDBGuid,
    D.FiscalYear,
    D.GroupingIdenticalArticle,
    D.CalculationGuid,
    D.Amount
FROM
    Data AS D
WHERE
    D.Amount <> 0

确保检查执行计划,看看它是否只计算一次。

关于sql-server - 避免在存储过程中重复函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57266514/

相关文章:

mysql - Mysql中通过注释选择存储过程名称

iphone - 如何从Objective-C调用SQL存储过程?

sql - 防止 sql 注入(inject) - 如果使用准备好的语句,为什么要转义输入?

python - 无法使用 PYODBC 连接到网络外部的远程 SQL Server

sql - 根据值聚合对行进行分组

sql-server - SSRS自定义排序一列ASC和DESC

sql - 有没有办法默认触发器在特定用户上运行以进行 DML 操作?

仅当列的所有值都匹配时才更新表的 SQL 查询

sql-server - 有没有办法从 Excel 特定单元格收集数据并发送给 SQL Server?

sql - 设置日期表达式格式的最佳位置。 SSRS 端还是 SQL Server 端?