Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何改进内部连接到可能为空tvp的存储过程代码_Sql Server_Tsql_Stored Procedures_Table Valued Parameters - Fatal编程技术网

Sql server 如何改进内部连接到可能为空tvp的存储过程代码

Sql server 如何改进内部连接到可能为空tvp的存储过程代码,sql-server,tsql,stored-procedures,table-valued-parameters,Sql Server,Tsql,Stored Procedures,Table Valued Parameters,我想改进以下存储过程的代码。我想把它合并到一个select语句中。你能想出更好的办法吗 CREATE PROCEDURE [dbo].[pr_FinDocument_Filter] @finDocIdForFilter [dbo].[GuidList] READONLY, @filteredSid nvarchar(64), @filteringOffsetInDay int AS BEGIN IF (@filteredSid is null or @filteringOf

我想改进以下存储过程的代码。我想把它合并到一个select语句中。你能想出更好的办法吗

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个查询,但它更复杂,可读性较差

下面的查询基于您的第二个查询。我修改了它,在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)
    )

我对左外连接有一个想法

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

我想这可能对你有用

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 )
                 )
            );

如果你标记使用的dbms,你会得到更好的答案-更快。@jarlh我认为它的tsql带有
RAISERROR
为什么你认为一个select语句更好?@MichałKomorowski,我不知道单语句SP如何。我对左外连接有一个想法。但可能存在另一种方式?如果可能,发布执行计划。这会有帮助的。很抱歉,正好有2个选项比1=)更可读