【问题标题】:Correct use of RowCount正确使用 RowCount
【发布时间】:2018-03-06 21:06:41
【问题描述】:

我的存储过程中有以下内容:

DECLARE @CustomerNumber nvarchar(50)

SELECT TOP 200 
    C.CustomerNumber as SourceSystemId,
    C.CustomerName,
    AccountManager,
    C.CustomerId        
FROM 
    Customer C WITH(NOLOCK, index (UQ_Customer_CustomerNumber))
LEFT JOIN 
    CustomerQuotingPreference cp WITH(NOLOCK)ON cp.CustomerId = C.CustomerId
WHERE  
    (C.CustomerName LIKE ('%1725614%') 
    OR C.CustomerNumber LIKE ('%' + CONVERT(VARCHAR(61), '1725614' ) +'%'))         
ORDER BY
    C.CustomerName

IF @@ROWCOUNT = 0  
BEGIN 
    SELECT DISTINCT 
        @CustomerNumber= C.CustomerNumber
    FROM
        [IFO].dbo.PricedealProposal PP
    JOIN
        IFO.dbo.OrderQuote OQ ON PP.OrderQuoteId = OQ.OrderQuoteId      
    JOIN
        Customer C ON C.CustomerId = OQ.CompanyId
    WHERE
        PP.PriceDealProposalId = '1725614' 

    EXEC [dbo].[Customer_ListCustomerDetailsByCustomerNumber] @searchString = @CustomerNumber   
END

当我运行这个时,我得到了两个选择的结果,而不是最后一个:

如何根据满足的条件仅从其中一个选择中获取结果?

【问题讨论】:

  • 听起来很适合使用EXISTS--看起来就是你所追求的

标签: sql sql-server-2008 stored-procedures rowcount


【解决方案1】:

肯定有很多不同的方法可以做到这一点。想到的一种方法是您可以将第一次选择的结果放入表变量或临时表中。然后根据行数大于 0 或 if 存在 select 1 from temp table type of check 执行 If/Else,最后根据 if/else 检查只执行一个选择,要么选择 off该临时表/变量或选择关闭选项 B。

【讨论】:

    【解决方案2】:

    怎么样...

    DECLARE @CustomerNumber nvarchar(50)
    IF NOT EXISTS(
            SELECT TOP 200 C.CustomerNumber as SourceSystemId
                ,C.CustomerName             
                ,AccountManager
                ,C.CustomerId       
            FROM Customer C WITH(NOLOCK, index (UQ_Customer_CustomerNumber))
            LEFT JOIN CustomerQuotingPreference cp WITH(NOLOCK)ON cp.CustomerId = C.CustomerId
            WHERE  (C.CustomerName like ('%1725614%') 
                OR C.CustomerNumber like ('%' + CONVERT(VARCHAR(61),'1725614' ) +'%'))
    )
            BEGIN 
                --NOTE TOP 1 HERE!
                select TOP 1 @CustomerNumber= C.CustomerNumber
                from [IFO].dbo.PricedealProposal PP
                join IFO.dbo.OrderQuote OQ
                on PP.OrderQuoteId = OQ.OrderQuoteId        
                join Customer C
                on C.CustomerId= OQ.CompanyId
                Where PP.PriceDealProposalId = '1725614' 
    
                EXEC [dbo].[Customer_ListCustomerDetailsByCustomerNumber] @searchString = @CustomerNumber   
            END
            ELSE
            BEGIN
                SELECT TOP 200 C.CustomerNumber as SourceSystemId
                    ,C.CustomerName             
                    ,AccountManager
                    ,C.CustomerId       
                FROM Customer C WITH(NOLOCK, index (UQ_Customer_CustomerNumber))
                LEFT JOIN CustomerQuotingPreference cp WITH(NOLOCK)ON cp.CustomerId = C.CustomerId
                WHERE  (C.CustomerName like ('%1725614%') 
                    OR C.CustomerNumber like ('%' + CONVERT(VARCHAR(61),'1725614' ) +'%'))
            END
    

    【讨论】:

    • 我同意@RossBush 并且真的没有那么认真地研究他们代码的那部分。很好的收获
    • 哦,请详细说明-1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多