Nullable-velden vergelijken in opgeslagen procedure

Ik heb een probleem met een opgeslagen procedure. Het vergelijkt een nieuw record met een bestaand record om te controleren op wijzigingen. Dit gebeurt als volgt:

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

Dit lijkt te mislukken als de velden NULL zijn. Ik weet het = NULL werkt niet zoals je zou verwachten, maar ik wist niet dat het ook faalt in dit soort dingen. Wanneer ik de veldvergelijking verander in dingen als

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

het werkt. Is er een betere manier om dit te doen?

1
Als u code, XML- of gegevenssamples post, PLEASE markeert u die regels in de teksteditor en klikt u op de knop "codevoorbeelden" ( {} ) op de werkbalk van de editor om mooi formaat en syntaxis markeer het!
toegevoegd de auteur marc_s, de bron
Ik ben ook geïnteresseerd in deze ergernis.
toegevoegd de auteur Valamas, de bron

3 antwoord

U kunt dergelijke cheques gebruiken:

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

Er is een slappeling om dit te doen: je kunt gelijkheden hebben zoals

NULL='' or ''=NULL

Ik weet niet of het acceptabel kan zijn in jouw scenario.

2
toegevoegd
Dit is prima als prestatie geen probleem is, maar het is niet sargabel.
toegevoegd de auteur HLGEM, de bron

SET ANSI_NULLS can control this behavior... Setting SET ANSI_NULLS OFF will make NULL = NULL evaluate to true.

Maar ik raad af om SET ANSI_NULLS OFF in te stellen, en probeer in plaats daarvan de velden in de database te beperken die "nullab" zijn.

2
toegevoegd
Bedankt. Ik kan helaas niet het aantal niet-toegestane velden beperken, dus ik ga met de optie ANSI_NULLS. Maar ik zal ervoor zorgen dat ik het verstandig gebruik;)
toegevoegd de auteur Jasper, de bron
@JoeStefanelli ok, maar wat zou u aanraden om in plaats daarvan goede controles uit te voeren?
toegevoegd de auteur Jasper, de bron
Hoewel het omslachtig is, is de vergelijking die u hebt gepost een goede manier om NULL-waarden te controleren.
toegevoegd de auteur Michael Fredrickson, de bron
Ik raad het ook af, vooral omdat SET ANSI_NULLS OFF een verouderde functie .
toegevoegd de auteur Joe Stefanelli, de bron

Dit gedrag wordt beheerst door de instelling ANSI_NULLS . Dit is standaard ingesteld op AAN en moet zo worden ingesteld dat verschillende zaken correct werken (zoals geïndexeerde weergaven en gedistribueerde query's), maar als u die niet nodig hebt, kunt u deze uitschakelen.

Lees er meer over op Boeken online .

1
toegevoegd
Terwijl ik op een ander antwoord opmerkte, merk ik op dat SET ANSI_NULLS OFF een verouderde functie die op een gegeven moment in de toekomst zal worden verwijderd.
toegevoegd de auteur Joe Stefanelli, de bron