带参数的查询返回不同的结果集

时间:2017-03-29 13:18:48

标签: sql sql-server

我有以下查询每次运行时返回不同的结果集。有时第二个查询返回数据,有时则不返回。

DECLARE @MinSentDateKey DATE = 
(
SELECT
    MIN([SentDateKey])
FROM 
    [dbo].[factEmail] [e]
WHERE 
    [DeliveredStatus] = 0
)

SELECT 
    [e].[EmailId],
    [e].[SentDateKey]
FROM 
    #Email e 
WHERE EXISTS
(
    SELECT 1 
    FROM 
        [dbo].[factEmail] [o]
    WHERE
        [o].[MessageKey] = [e].[MessageKey]
    AND 
        [o].[EmailKey] = [e].[EmailKey]
    AND
        [o].[SentDateKey] >= @MinSentDateKey
)

我已将问题隔离到以下行

[o].[SentDateKey] >= @MinSentDateKey

将变量替换为实际的硬编码值始终返回正确的结果集。 [o]。[SentDateKey]是DATE日期类型,@ MinSentDateKey永远不会改变它的值。我也注意到这总是返回正确的结果集:

 [o].[SentDateKey] >= DATEADD(DAY,0, @MinSentDateKey)

我有一种感觉,这是由参数嗅探引起的,到目前为止已经尝试了OPTION(RECOMPILE)而没有运气。

编辑:[dbo]。[factEmail]和#Email中的数据是静态的,并且在任何时候都不会改变。

1 个答案:

答案 0 :(得分:0)

不是单独选择,为什么不组合它们呢?

SELECT 
    [e].[EmailId],
    [e].[SentDateKey]
FROM 
    #Email e 
WHERE EXISTS
(
    SELECT 1 
    FROM 
        [dbo].[factEmail] [o]
    WHERE
        [o].[MessageKey] = [e].[MessageKey]
    AND 
        [o].[EmailKey] = [e].[EmailKey]
    AND
        [o].[SentDateKey] >= 
        (
        SELECT
            MIN([SentDateKey])
        FROM 
            [dbo].[factEmail]
        WHERE 
            [DeliveredStatus] = 0
        )
)

这假设它选择的MIN([SentDateKey])具有正确的值。

要做的另一件事是不要将@MinSentDateKey键入DATE,而是键入DateTime或者作为Date2 - 无论表列实际是什么。