2011-10-27 1 views
1

Je rencontre un problème avec une procédure stockée. Il compare un nouvel enregistrement avec un enregistrement existant pour vérifier les changements. Ceci est fait comme ceci:Comparaison de champs nullables dans une procédure stockée

SELECT 1 FROM Table 
WHERE Id= @Id 
AND Field1 = @Field1 
AND Field2 = @Field2 
AND Field3 = @Field3 
AND Field4 = @Field4 
AND Field5 = @Field5 
AND LEDTS IS NULL 

Cela semble échouer lorsque les champs sont NULL. Je sais que NULL ne fonctionne pas comme vous le souhaiteriez, mais je ne savais pas que ça échouait aussi dans des choses comme ça. Quand je change la comparaison de champ à des choses comme

(Field1 IS NULL AND Field2 IS NULL) OR Field1 = @Field2 

cela fonctionne. Y a-t-il une meilleure manière de faire cela?

+0

Je m'intéresse aussi à cette gêne. –

+0

Si vous postez du code, XML ou des exemples de données, ** PLEASE ** surlignez ces lignes dans l'éditeur de texte et cliquez sur le bouton "samples" ("{}") dans la barre d'outils de l'éditeur. –

Répondre

2

SET ANSI_NULLS can control this behavior... Le paramètre SET ANSI_NULLS OFF permet d'attribuer la valeur NULL = NULL à true.

Mais je recommanderais de ne pas définir réellement SET ANSI_NULLS OFF, et plutôt essayer de limiter les champs de la base de données qui sont "Nullable".

+1

Je recommanderais aussi contre cela, d'autant plus que 'SET ANSI_NULLS OFF' est une [fonctionnalité obsolète] (http://msdn.microsoft.com/en-us/library/ms143729.aspx). –

+0

Merci. Je ne peux malheureusement pas limiter le nombre de champs NULL, donc je vais utiliser l'option ANSI_NULLS. Mais je vais m'assurer de l'utiliser à bon escient;) – Jasper

+0

@JoeStefanelli ok, mais que recommanderiez-vous plutôt de faire les vérifications appropriées? – Jasper

2

Vous pouvez utiliser les chèques comme ceci:

ISNULL(Field1, '') = ISNULL(@Field1, '') 

Il y a un drowback faire ceci, vous pouvez avoir des égalités comme

NULL='' or ''=NULL 

Je sais Dont't si elle pourrait être acceptable dans votre scénario .

+0

C'est très bien si les performances ne sont pas un problème, mais ce n'est pas sargable. – HLGEM

1

Ce comportement est régi par le paramètre ANSI_NULLS. La valeur par défaut est ON et doit être définie de cette façon pour que diverses choses fonctionnent correctement (telles que les vues indexées et les requêtes distribuées), mais si vous n'en avez pas besoin, vous pouvez le désactiver.

En savoir plus à ce sujet à Books Online.

+1

Comme je l'ai commenté sur une autre réponse, notez que «SET ANSI_NULLS OFF» est une [fonctionnalité obsolète] (http://msdn.microsoft.com/en-us/library/ms143729.aspx) qui sera enlevé à un moment donné A l'avenir. –

Questions connexes