Comparaisons T-SQL Null dans une procédure stockée

J'ai un léger problème avec une procédure stockée dans SQL Server. J'essaie de sélectionner un numéro de téléphone pour get son Id , mais j'ai des problèmes avec la colonne PhoneExtension définie comme int et autorisant des PhoneExtension nulles.

Le code suivant fonctionne, mais peut ne pas renvoyer les résultats souhaités (le même numéro de téléphone avec plusieurs extensions peut exister)

 CREATE PROCEDURE [dbo].[GetPhoneNumberId] @phoneNumber INT, @phoneExtension INT = NULL, @countryCode INT = 1, @PhoneNumberId INT OUTPUT AS BEGIN SET @PhoneNumberId = (SELECT TOP 1 PhoneNumberId FROM PhoneNumbers WHERE PhoneNumber = @phoneNumber AND PhoneCountryCode = @countryCode); END 

Le suivant ne fonctionne pas si @phoneExtension est NULL et l'logging dans la table PhoneNumbers est NULL pour PhoneExtenstion

 CREATE PROCEDURE [dbo].[GetPhoneNumberId] @phoneNumber INT, @phoneExtension INT = NULL, @countryCode INT = 1, @PhoneNumberId INT OUTPUT AS BEGIN SET @PhoneNumberId = (SELECT TOP 1 PhoneNumberId FROM PhoneNumbers WHERE PhoneNumber = @phoneNumber AND PhoneExtension = @phoneExtension AND PhoneCountryCode = @countryCode); END 

Vous pouvez essayer ceci:

 CREATE PROCEDURE [dbo].[GetPhoneNumberId] @phoneNumber INT, @phoneExtension INT = NULL, @countryCode INT = 1, @PhoneNumberId INT OUTPUT AS BEGIN SET @PhoneNumberId = (SELECT TOP 1 PhoneNumberId FROM PhoneNumbers WHERE PhoneNumber = @phoneNumber AND (ISNULL(PhoneExtension, '') = ISNULL(@phoneExtension, '')) AND PhoneCountryCode = @countryCode); END 

Vous pouvez essayer ceci:

 CREATE PROCEDURE [dbo].[GetPhoneNumberId] @phoneNumber INT, @phoneExtension INT = NULL, @countryCode INT = 1, @PhoneNumberId INT OUTPUT AS BEGIN SET @PhoneNumberId = (SELECT TOP 1 PhoneNumberId FROM PhoneNumbers WHERE PhoneNumber = @phoneNumber AND ( PhoneExtension = @phoneExtension OR (PhoneExtension IS NULL AND @phoneExtension IS NULL) ) AND PhoneCountryCode = @countryCode); END 

Changement

 PhoneExtension = @phoneExtension 

dans

 PhoneExtension = ISNULL(@phoneExtension, PhoneExtension) 

Quand @phoneExtension est NULL , cette condition de filter sera fondamentalement ignorée.