Tengo un pequeño problema con un procedimiento almacenado en SQL Server. Estoy tratando de seleccionar un número de teléfono para obtener su Id, pero tengo problemas con la columna PhoneExtension definida como int y que permite nulos.

El siguiente código funciona, pero puede no devolver los resultados deseados (puede existir el mismo número de teléfono con varias extensiones)

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

El siguiente no funciona si @phoneExtension es NULL y el registro en la tabla PhoneNumbers tiene NULL para 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
2
elhs16 17 oct. 2017 a las 20:10

3 respuestas

La mejor respuesta

Puedes probar esto:

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
1
Md. Suman Kabir 17 oct. 2017 a las 17:51

Cambio

PhoneExtension = @phoneExtension

En

PhoneExtension = ISNULL(@phoneExtension, PhoneExtension)

Cuando @phoneExtension es NULL, esta condición de filtro básicamente se ignorará.

0
glennsl 17 oct. 2017 a las 17:26

Puedes probar esto:

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
1
gotqn 17 oct. 2017 a las 17:42