none
erro na minha procedure RRS feed

  • Pergunta

  • pessoa, estou com dificuldade quando vou 'exec' esta procedure. esta esta erra? como posso resolver?. por favor me ajudem!

    execução

    exec uspPessoaFisicaInserir '321564','32165487','luissantana'

    mensagem de erro:

    "Não é possível inserir o valor NULL na coluna 'IDPessoaFisica', tabela 'DBsystem.dbo.tblPessoaFisica'; a coluna não permite nulos. Falha em INSERT."

    segue procedure:

    ALTER PROCEDURE [dbo].[uspPessoaFisicaInserir]
    @CPF as varchar(11),
    @RG as varchar(20),
    @NomeCompleto as varchar(50)

    AS

    BEGIN
    --exceçao(try / carch)
    --transacao(tran /commit tran)
    BEGIN TRY
    BEGIN TRAN
    --NAO DEIXA INSERIR IGUAL NO BANCO
    IF(EXISTS(SELECT IDPessoaFisica FROM tblPessoaFisica WHERE CPF =@CPF))
    RAISERROR('CPF já existe', 14,1);

    DECLARE @IDPessoa AS INT;
    --1º inserir na tabela tblPessoa
    INSERT INTO tblPessoa(IDPessoaTipo)
    VALUES(1);

    SET @IDPessoa = @@IDENTITY;
    --2º INSERIR NA TABELA tblPessoaFisica
    INSERT INTO tblPessoaFisica(CPF, RG, NomeCompleto)
    VALUES (@CPF, @RG, @NomeCompleto);

    SELECT @IDPessoa AS RETORNO;

    COMMIT TRAN
    END TRY
    BEGIN CATCH
    ROLLBACK TRAN
    SELECT ERROR_MESSAGE() AS RETORNO;
    END CATCH
    END

    quarta-feira, 14 de setembro de 2016 02:02

Respostas

  • Olá Luis,

    A mensagem de erro é bem clara, no momento que está tentando inserir na tabela "tblPessoaFisica" não estás passando o valor para o campo IDPessoaFisica (que pelo erro não parece ser um campo auto increment) e não aceita valores nulos, portanto teria que passar um valor ou deixar essa coluna como Identity (auto increment).

    Por outro lado tem uma variável @IDPessoa que não está sendo usada no INSERT, se ela for a informação que deve ir nesta coluna IDPessoaFisica, basta deixar assim:

    ALTER PROCEDURE [dbo].[uspPessoaFisicaInserir]
    @CPF as varchar(11),
    @RG as varchar(20),
    @NomeCompleto as varchar(50)
    
    AS
    
    BEGIN
    --exceçao(try / carch)
    --transacao(tran /commit tran)
    BEGIN TRY
    BEGIN TRAN
    --NAO DEIXA INSERIR IGUAL NO BANCO
    IF(EXISTS(SELECT IDPessoaFisica FROM tblPessoaFisica WHERE CPF =@CPF))
    RAISERROR('CPF já existe', 14,1);
    
    DECLARE @IDPessoa AS INT;
    --1º inserir na tabela tblPessoa
    INSERT INTO tblPessoa(IDPessoaTipo)
    VALUES(1);
    
    SET @IDPessoa = @@IDENTITY;
    --2º INSERIR NA TABELA tblPessoaFisica
    INSERT INTO tblPessoaFisica(IDPessoaFisica, CPF, RG, NomeCompleto)
    VALUES (@IDPessoa, @CPF, @RG, @NomeCompleto);
    
    SELECT @IDPessoa AS RETORNO;
    
    COMMIT TRAN
    END TRY
    BEGIN CATCH
    ROLLBACK TRAN
    SELECT ERROR_MESSAGE() AS RETORNO;
    END CATCH
    END

    Espero ter ajudado!

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quarta-feira, 14 de setembro de 2016 11:04

Todas as Respostas

  • Olá Luis,

    A mensagem de erro é bem clara, no momento que está tentando inserir na tabela "tblPessoaFisica" não estás passando o valor para o campo IDPessoaFisica (que pelo erro não parece ser um campo auto increment) e não aceita valores nulos, portanto teria que passar um valor ou deixar essa coluna como Identity (auto increment).

    Por outro lado tem uma variável @IDPessoa que não está sendo usada no INSERT, se ela for a informação que deve ir nesta coluna IDPessoaFisica, basta deixar assim:

    ALTER PROCEDURE [dbo].[uspPessoaFisicaInserir]
    @CPF as varchar(11),
    @RG as varchar(20),
    @NomeCompleto as varchar(50)
    
    AS
    
    BEGIN
    --exceçao(try / carch)
    --transacao(tran /commit tran)
    BEGIN TRY
    BEGIN TRAN
    --NAO DEIXA INSERIR IGUAL NO BANCO
    IF(EXISTS(SELECT IDPessoaFisica FROM tblPessoaFisica WHERE CPF =@CPF))
    RAISERROR('CPF já existe', 14,1);
    
    DECLARE @IDPessoa AS INT;
    --1º inserir na tabela tblPessoa
    INSERT INTO tblPessoa(IDPessoaTipo)
    VALUES(1);
    
    SET @IDPessoa = @@IDENTITY;
    --2º INSERIR NA TABELA tblPessoaFisica
    INSERT INTO tblPessoaFisica(IDPessoaFisica, CPF, RG, NomeCompleto)
    VALUES (@IDPessoa, @CPF, @RG, @NomeCompleto);
    
    SELECT @IDPessoa AS RETORNO;
    
    COMMIT TRAN
    END TRY
    BEGIN CATCH
    ROLLBACK TRAN
    SELECT ERROR_MESSAGE() AS RETORNO;
    END CATCH
    END

    Espero ter ajudado!

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quarta-feira, 14 de setembro de 2016 11:04
  • Se o objetivo e retornar o id da pessoa inserido fica assim, primeiro vc faz o insert na tabela  e depois recupera o @@IDENTITY


    ALTER PROCEDURE [dbo].[uspPessoaFisicaInserir]
        @CPF AS varchar(11) ,
        @RG AS varchar(20) ,
        @NomeCompleto AS varchar(50)
    AS


        BEGIN
    DECLARE
        @CPF AS varchar(11) ='321567' ,
        @RG AS varchar(20) ='32165487' ,
        @NomeCompleto AS varchar(50) ='luissantana'
            BEGIN TRY
                BEGIN TRAN
    --NAO DEIXA INSERIR IGUAL NO BANCO
                IF ( EXISTS ( SELECT    IDPessoaFisica
                              FROM      dbo.tblPessoaFisica
                              WHERE     CPF = @CPF ) )
                    RAISERROR('CPF já existe', 14,1);

                DECLARE @IDPessoa AS INT;
    --1º inserir na tabela tblPessoa
                INSERT  INTO dbo.tblPessoa
                        ( IDPessoaTipo )
                VALUES  ( 1 );

                --SET @IDPessoa = @@IDENTITY;
    --2º INSERIR NA TABELA tblPessoaFisica
                INSERT  INTO dbo.tblPessoaFisica
                        ( CPF, RG, NomeCompleto )
                VALUES  ( @CPF, @RG, @NomeCompleto );

    SET @IDPessoa =@@IDENTITY

                SELECT  @IDPessoa AS RETORNO;

                COMMIT TRAN
            END TRY
            BEGIN CATCH
                ROLLBACK TRAN
                SELECT  ERROR_MESSAGE() AS RETORNO;
            END CATCH
        END


    Wesley Neves

    • Sugerido como Resposta Wesley Neves quarta-feira, 14 de setembro de 2016 13:54
    • Não Sugerido como Resposta Wesley Neves quarta-feira, 14 de setembro de 2016 13:55
    quarta-feira, 14 de setembro de 2016 13:54
  • Luis,

    Talvez uma outra possibilidade poderia ser utilizar a cláusula Output no seu Insert, desta forma, o SQL Server vai retornar dentro do bloco do insert os valores novos específicos para cada campo manipulado.

    Veja se este exemplo ajuda:

    --Inserindo Dados na Tabela1 e Retornando os valores para claúsula Output--
    Insert Into Tabela1(Valor, DataCriacao, DataManipulacao) 
    Output inserted.Codigo, inserted.Valor, inserted.DataCriacao, inserted.DataManipulacao
     Values(10, GETDATE(), GETDATE()+1),
           (20, GETDATE(), GETDATE()+2),
           (30, GETDATE(), GETDATE()+3),
           (40, GETDATE(), GETDATE()+4)


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 14 de setembro de 2016 17:40
  • ajudou muito obrigado.
    quinta-feira, 15 de setembro de 2016 12:41
  • Favor marcar como resposta a opção que representa a sua solução!

    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quinta-feira, 15 de setembro de 2016 13:12