Sql server 我的SQL Server子查询始终返回NULL

Sql server 我的SQL Server子查询始终返回NULL,sql-server,null,subquery,Sql Server,Null,Subquery,我有一个表“Representantes”,其中有一个字段“allownulls”,称为“Complemento”。 问题是,当“Complemento”为null或为空时,子查询总是返回null,但当“Complemento”有任何值时,子查询工作正常 看看我的代码 求你了 `USE [Realb_DB] GO /****** Object: StoredProcedure [dbo].[CadastrarRepresentante] Script Date: 01/12/2015 1

我有一个表“Representantes”,其中有一个字段“allownulls”,称为“Complemento”。 问题是,当“Complemento”为null或为空时,子查询总是返回null,但当“Complemento”有任何值时,子查询工作正常

看看我的代码

求你了

`USE [Realb_DB]
GO
/****** Object:  StoredProcedure [dbo].[CadastrarRepresentante]    Script Date: 01/12/2015 19:54:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[CadastrarRepresentante]
    @RazaoSocial nvarchar(100),
    @Nome_Fantasia nvarchar(100),
    @CNPJ nvarchar(50), 
    @Gestor_Responsavel nvarchar(100),
    @RG_Gestor nvarchar(25),
    @CPF_Gestor nvarchar(25),

    @Logradouro nvarchar(100),
    @Bairro nvarchar(100),
    @Numero nvarchar(100),
    @Complemento nvarchar(100) = null,
    @Municipio nvarchar(100),
    @Estado nvarchar(100)
AS
BEGIN

EXEC dbo.cadastrarEndereco @Logradouro = @Logradouro , @Bairro = @Bairro , @Numero = @Numero , 
@Complemento = @Complemento , @Municipio = @Municipio , @Estado = @Estado ;

        WITH CTE_ENDERECO2(ID_Endereco)
        AS (SELECT TOP 1 ID_Endereco FROM dbo.Tabela_Endereco 
        WHERE Logradouro = @Logradouro AND Bairro = @Bairro AND Numero = @Numero
        AND Complemento = @Complemento AND Municipio = @Municipio AND Estado = @Estado ) 

        INSERT INTO Tabela_Representante(Razao_Social, Nome_Fantasia, CNPJ, Gestor_Responsavel, RG_Gestor, CPF_Gestor, FK_Endereco) VALUES(@RazaoSocial,@Nome_Fantasia,@CNPJ,@Gestor_Responsavel,@RG_Gestor,@CPF_Gestor,(SELECT ID_Endereco FROM CTE_ENDERECO2)) 

END`
错误消息


如何修复它?

根据子查询的要求,您可以使用以下任一选项:

选项1:使用IFNULL,如果为null,则使用0或任何其他数字进行比较

SELECT TOP 1 ID_Endereco FROM dbo.Tabela_Endereco 
        WHERE Logradouro = @Logradouro AND Bairro = @Bairro AND Numero = @Numero
        AND IFNULL(Complemento, 0) = @Complemento AND Municipio = @Municipio AND Estado = @Estado 
选项2:在此列中添加对空值的额外检查

SELECT TOP 1 ID_Endereco FROM dbo.Tabela_Endereco 
        WHERE Logradouro = @Logradouro AND Bairro = @Bairro AND Numero = @Numero
        AND (Complemento = @Complemento OR Complemento is null) AND Municipio = @Municipio AND Estado = @Estado 

我认为应该使用forSQL:
ISNULL(列名称、值)
和for MYSQL:
IFNULL(列名称、值)
如果您将空白值作为参数传递给此过程。因此,它将检查列中是否有空白,并将其转换为空白

在你的情况下试试这个

(SELECT TOP 1 ID_Endereco FROM dbo.Tabela_Endereco 
        WHERE Logradouro = @Logradouro AND Bairro = @Bairro AND Numero = @Numero
        AND IFNULL(Complemento, '') = @Complemento AND Municipio = @Municipio AND Estado = @Estado )

谢谢兄弟,我要试试。你应该把你的错误信息以文本的形式发布,你应该把它翻译成英语,这样我们大多数人都能理解它……我相信根据你的说法,我的ans是正确的,所以一定要批准它。:)