2017-03-29 4 views
0

J'ai la requête suivante renvoyant des résultats différents chaque fois qu'il s'exécute. Parfois, la deuxième requête renvoie des données et parfois non.La requête avec le paramètre renvoie des ensembles de résultats différents

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 
) 

J'ai isolé la question à la ligne suivante

[o].[SentDateKey] >= @MinSentDateKey 

en remplaçant la variable par la valeur codée en dur réelle retourne toujours le bon ResultSet. [o]. [SentDateKey] est un datetype DATE et @MinSentDateKey ne modifie jamais sa valeur. Je l'ai aussi remarqué que cela retourne toujours le bon ResultSet:

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

J'ai le sentiment que cela est causé par le paramètre renifler et jusqu'à présent ont essayé OPTION (RECOMPILE) sans chance.

EDIT: Les données de [dbo]. [FactEmail] et #Email sont statiques et elles ne changent à aucun moment.

+2

Je suppose que dans certains moments, vous avez des emails non délivrés '[DeliveredStatus] = 0', parfois non. –

+0

L'analyse des paramètres n'entraîne pas de différences entre les résultats d'une requête. Comme déjà dit, la seule chose qui a du sens ici est que vos données changent. –

+0

Comme je l'ai déjà dit, @MinSentDateKey reste toujours le même et les données sous-jacentes ne changent pas. Le codage en dur de la valeur de date renvoie toujours le même nombre de lignes. L'utilisation de la variable renvoie un jeu de résultats vide ou, occasionnellement, renvoie le nombre de lignes correct. –

Répondre

0

Au lieu de sélections séparées, pourquoi ne pas les combiner? Ceci suppose que le MIN ([SentDateKey]) sélectionné a la bonne valeur. L'autre chose à faire est de ne pas taper @MinSentDateKey en tant que DATE mais en tant que DateTime ou peut-être en tant que Date2 - quelle que soit la colonne de la table.

+0

[o]. [DateDéposée] est DATE, tout comme @MinSentDateKey. Utiliser une sous-requête pour remplacer la variable fonctionne mais je voudrais savoir quel est le problème dans son état actuel. –