我有以下查询每次运行时返回不同的结果集。有时第二个查询返回数据,有时则不返回。
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中的数据是静态的,并且在任何时候都不会改变。
答案 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 - 无论表列实际是什么。