none
Erro em procedure com output sem retorno RRS feed

  • Pergunta

  • Boa noite a todos,

    Estou com uma procedure que deveria retornar a Identity na saída, mas ao testar o funcionamento da procedure, só retorna NULL. Onde estou errando?

    Coloquei o código para criar uma tabela no tempdb para facilitar nos testes da procedure. Segue o código:

    USE [tempdb]
    GO

    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    SET ANSI_PADDING ON
    GO

    CREATE TABLE [dbo].[cadastro](
        [id_cadastro] [int] IDENTITY(1,1) NOT NULL,
        [nome] [varchar](50) NULL,
        [telefone] [varchar](50) NULL,
        [endereco] [varchar](50) NULL
    ) ON [PRIMARY]

    GO

    SET ANSI_PADDING OFF
    GO

    CREATE PROCEDURE dbo.inserir
        @id int output,
        @nome varchar(50),
        @telefone varchar(50),
        @endereco varchar(50)
    AS
        INSERT INTO dbo.cadastro(nome,telefone,endereco) VALUES(@nome,@telefone,@endereco)
        SET @id = (SELECT @@IDENTITY);

    DECLARE @codigo INT;

    EXEC dbo.inserir @nome='teste',@telefone='telefone',@endereco='endereço',@id = @codigo;

    SELECT @codigo

    quinta-feira, 17 de outubro de 2013 02:58

Respostas

  • Olá,

    Tente alterar a sua procedure conforme abaixo:

    alter PROCEDURE dbo.inserir
        @nome varchar(50),
        @telefone varchar(50),
        @endereco varchar(50),
    @id int output
    AS
        INSERT INTO dbo.cadastro(nome,telefone,endereco) VALUES(@nome,@telefone,@endereco)
        SET @id = (SELECT @@IDENTITY)



    DECLARE @codigo INT=1;

    EXEC dbo.inserir @nome='teste',@telefone='telefone',@endereco='endereço', @id=@codigo output;

    SELECT @codigo


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |


    • Editado Roberto Galvão quinta-feira, 17 de outubro de 2013 12:11
    • Marcado como Resposta LWMN sexta-feira, 18 de outubro de 2013 01:50
    quinta-feira, 17 de outubro de 2013 12:01
  • Deleted
    • Marcado como Resposta LWMN sexta-feira, 18 de outubro de 2013 01:53
    quinta-feira, 17 de outubro de 2013 12:10

Todas as Respostas

  • Olá,

    Tente alterar a sua procedure conforme abaixo:

    alter PROCEDURE dbo.inserir
        @nome varchar(50),
        @telefone varchar(50),
        @endereco varchar(50),
    @id int output
    AS
        INSERT INTO dbo.cadastro(nome,telefone,endereco) VALUES(@nome,@telefone,@endereco)
        SET @id = (SELECT @@IDENTITY)



    DECLARE @codigo INT=1;

    EXEC dbo.inserir @nome='teste',@telefone='telefone',@endereco='endereço', @id=@codigo output;

    SELECT @codigo


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |


    • Editado Roberto Galvão quinta-feira, 17 de outubro de 2013 12:11
    • Marcado como Resposta LWMN sexta-feira, 18 de outubro de 2013 01:50
    quinta-feira, 17 de outubro de 2013 12:01
  • Deleted
    • Marcado como Resposta LWMN sexta-feira, 18 de outubro de 2013 01:53
    quinta-feira, 17 de outubro de 2013 12:10
  • Olá,

    Tente alterar a sua procedure conforme abaixo:

    alter PROCEDURE dbo.inserir
        @nome varchar(50),
        @telefone varchar(50),
        @endereco varchar(50),
    @id int output
    AS
        INSERT INTO dbo.cadastro(nome,telefone,endereco) VALUES(@nome,@telefone,@endereco)
        SET @id = (SELECT @@IDENTITY)



    DECLARE @codigo INT=1;

    EXEC dbo.inserir @nome='teste',@telefone='telefone',@endereco='endereço', @id=@codigo output;

    SELECT @codigo


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |


    Roberto, funcionou!!

    Obrigado!

    sexta-feira, 18 de outubro de 2013 01:50
  • "WMN8", faltou informar na chamada da rotina que a variável @codigo recebe um valor:

           EXEC dbo.inserir @nome='teste',@telefone='telefone',@endereco='endereço',@id = @codigo OUTPUT;

    Detalhes em EXECUTE e em  CREATE PROCEDURE.

    Com relação ao corpo da rotina, faltou delimitar os comandos com o par BEGIN-END.

    AS
    begin
    INSERT INTO dbo.cadastro(nome,telefone,endereco) VALUES (@nome,@telefone,@endereco);
    set @id = @@IDENTITY;
    end;

    Em tempo, fique atento a como executa o código de criação da rotina. Eis o código completo, com a separação de blocos para não gerar algo inesperado:

    USE [tempdb]
    
    CREATE TABLE [dbo].[cadastro](
        [id_cadastro] [int] IDENTITY(1,1) NOT NULL,
        [nome] [varchar](50) NULL,
        [telefone] [varchar](50) NULL,
        [endereco] [varchar](50) NULL
    )
    go create PROCEDURE dbo.inserir @id int output, @nome varchar(50), @telefone varchar(50), @endereco varchar(50) AS begin
    set NOCOUNT ON; INSERT INTO dbo.cadastro(nome,telefone,endereco) VALUES (@nome,@telefone,@endereco) SET @id = @@IDENTITY; end; go DECLARE @codigo INT; EXEC dbo.inserir @nome='teste',@telefone='telefone',@endereco='endereço',@id = @codigo output; SELECT @codigo;


        José Diz     Belo Horizonte, MG - Brasil
    (Se encontrou a solução nesta resposta, ou se o conteúdo foi útil, lembre-se de marcá-la)



    José, gostei das dicas, costumava usar o BEGIN nos casos de estruturas condicionais ou instruções extensas, vou ficar atento ao uso dele. Você recomenda usar sempre?
    sexta-feira, 18 de outubro de 2013 01:53