2015-11-03 81 views
1

我想改进以下存储过程的代码。我想将它加入到单个选择语句中。你能以更好的方式为目标吗?如何提高存储过程的代码与内部联接到可能的空tvp

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 
+0

如果您标记使用的dbms,您将得到更好的答案 - 更快。 – jarlh

+0

@jarlh我认为它的tsql与'RAISERROR' – Matt

+0

为什么你认为单个select语句更好? –

回答

1

我认为将2个选择合并为一个不会改进您的代码。为了比较,这里是一个例子,你可以做到这一点。我们有1个查询,但它更复杂,可以被视为不太可读。

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

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) 
    ) 
+0

我同意,2选择较少可读性。任何方式,谢谢 – isxaker

+0

我的意思是,1选择是不太可读;) –

+0

我很抱歉,确切地说2选择比1 =))更可读) – isxaker

0

我有一个想法有关left outer join

SELECT TABLEA.Id 
FROM 
    TABLEA 
    left join TVP 
     on TVP.Id = TABLEA.Id 
WHERE 
    TABLEA.sid = @filteredSid 
    AND DATEDIFF(DAY, CONVERT(DATE, TABLEA.value, 105), CONVERT(DATE, GETDATE(), 126)) = @filteringOffsetInDay 
    AND 
    (
     TVP.Id is not null 
     OR 
     NOT EXISTS (SELECT 1 FROM TVP) 
    ) 
2

我认为这可能为你工作。

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