如何将内连接的存储过程代码改进为可能为空的 tvp [英] How to improve the code of stored procedure with inner join to possible empty tvp

查看:20
本文介绍了如何将内连接的存储过程代码改进为可能为空的 tvp的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想改进以下存储过程的代码.我想将它加入单个选择语句.你能找到更好的方法吗?

I want to improve the code of the following stored procedure. I want to join it into single select statement. Can you purpose a better way?

CREATE PROCEDURE [dbo].[pr_FinDocument_Filter]
  @finDocIdForFilter [dbo].[GuidList] READONLY,
  @filteredSid nvarchar(64),
  @filteringOffsetInDay int
AS
BEGIN

    IF (@filteredSid is null or @filteringOffsetInDay is null)
        BEGIN
            RAISERROR(N'arguments must have a value', 15, 1);
        END

    IF EXISTS (SELECT 1 FROM @finDocIdForFilter)
        BEGIN
            SELECT fin_doc_extra.docId
            FROM
                [CpsOther].[dbo].[FinDocumentExtra] AS fin_doc_extra
                INNER JOIN @finDocIdForFilter       AS fin_doc_for_filter
                    ON fin_doc_extra.docId = fin_doc_for_filter.Id
                    AND fin_doc_extra.sid = @filteredSid
            WHERE
                DATEDIFF(DAY, CONVERT(DATE, fin_doc_extra.value, 105), CONVERT(DATE, GETDATE(), 126)) = @filteringOffsetInDay
        END
    ELSE
        BEGIN
            SELECT fin_doc_extra.docId
            FROM
                [CpsOther].[dbo].[FinDocumentExtra] AS fin_doc_extra
            WHERE
                fin_doc_extra.sid = @filteredSid
                AND DATEDIFF(DAY, CONVERT(DATE, fin_doc_extra.value, 105), CONVERT(DATE, GETDATE(), 126)) = @filteringOffsetInDay
        END

END

推荐答案

我认为将 2 个选择合并为一个没有必要改进您的代码.为了进行比较,这里有一个示例,您可以如何做到这一点.我们有 1 个查询,但它更复杂,可读性较差.

I think that merging 2 selects into one will not necessary improve your code. For comparison, here is an example how you can do that. We have 1 query but it is more complex and can be perceived as less readable.

以下查询基于您的第二个查询.我通过向 WHERE 语句添加附加条件对其进行了修改.如果 @finDocIdForFilter 为空或 @finDocIdForFilter 包含匹配的行,则将满足此额外条件.

The query below is based on your your second query. I modified it by adding an additional condition to WHERE statement. This extra condition will be satisfied if @finDocIdForFilter is empty or if @finDocIdForFilter contains matching rows.

SELECT fin_doc_extra.docId
FROM
    [CpsOther].[dbo].[FinDocumentExtra] AS fin_doc_extra
WHERE
    fin_doc_extra.sid = @filteredSid AND
    DATEDIFF(DAY, CONVERT(DATE, fin_doc_extra.value, 105), CONVERT(DATE, GETDATE(), 126)) = @filteringOffsetInDay 
    AND
    (
        NOT EXISTS(SELECT 1 FROM @finDocIdForFilter) 
        OR 
        EXISTS(
            SELECT 1 
            FROM @finDocIdForFilter AS fin_doc_for_filter
                ON fin_doc_extra.docId = fin_doc_for_filter.Ida.AssetCode)
    )

这篇关于如何将内连接的存储过程代码改进为可能为空的 tvp的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆