none
Erro em declaração de variável local RRS feed

  • Pergunta

  • Olá amigos, estou com um problema que parece ser um tanto simples, mas que está me custando algum tempo para resolver:

    Tenho essa procedure de exemplo do AdventureWorks:


    CREATE PROC HumanResources.AddDepartment
      @Name nvarchar(50), @GroupName nvarchar(50),
      @DeptID smallint OUTPUT
    AS
     
    INSERT INTO HumanResources.Department (Name, GroupName)
    VALUES (@Name, @GroupName)
     
    SET @DeptID = SCOPE_IDENTITY()


    Para eu passar o parâmetro de saída:

    DECLARE @dept int

    EXEC AddDepartment 'Refunds', '', @dept OUTPUT

    SELECT @dept


    Mas aparece que a variável não está declarada. Já tentei declarar outras variáveis mas não dá de jeito nenhum.

    Agradeço qualquer ajuda desde já.

    quarta-feira, 7 de janeiro de 2009 17:15

Respostas

  • Olá Gabriel,

     

    Se você executar esse código, do jeito que está aqui, ele funciona:

     

    Code Snippet

    CREATE PROC HumanResources.AddDepartment

    @Name nvarchar(50), @GroupName nvarchar(50),

    @DeptID smallint OUTPUT

    AS

    INSERT INTO HumanResources.Department (Name, GroupName)

    VALUES (@Name, @GroupName)

    SET @DeptID = SCOPE_IDENTITY()

    GO

     

    DECLARE @dept int

    EXEC HumanResources.AddDepartment 'aaaa', '', @dept OUTPUT

    SELECT @dept

     

     

     

    Abraços

     

    quinta-feira, 8 de janeiro de 2009 15:51

Todas as Respostas

  • Olá,

     

    Faltou você colocar o esquema ao executar a procedure:

     

    DECLARE @dept int

    EXEC HumanResources.AddDepartment 'Refunds', '', @dept OUTPUT

    SELECT @dept

     

     

    Abraços

    quarta-feira, 7 de janeiro de 2009 17:39
  • Boa Tarde Gabriel Olivério,

     

    Seja bem vindo ao fórum de SQL Server no MSDN.

     

    Nós participantes do fórum tentaremos ajudá-los em suas dúvidas e problemas de SQL Server através do nosso conhecimento, experiência e disponibilidade.

     

    Não vi nenhum na sua construção. Inclusive fiz um teste e consegui recuperar o valor do parâmetro de retorno. Sugiro verificar senão há nenhum tratamento de erro (Try Catch) ou a nomeclatura dos objetos que esteja "ocultando" o problema.

     

    O seguinte script funcionou:

     

    Code Snippet

    CREATE SCHEMA HumanResources

    GO

     

    CREATE TABLE HumanResources.Department (DeptID INT IDENTITY(1,1), Name VARCHAR(20), GROUPNAME VARCHAR(20))

    GO

     

    CREATE PROC HumanResources.AddDepartment

    @Name nvarchar(50), @GroupName nvarchar(50),

    @DeptID smallint OUTPUT

    AS

    INSERT INTO HumanResources.Department (Name, GroupName)

    VALUES (@Name, @GroupName)

    SET @DeptID = SCOPE_IDENTITY()

    GO

     

    DECLARE @dept int

     

    EXEC HumanResources.AddDepartment 'Refunds 1', '', @dept OUTPUT

    SELECT @dept

     

    EXEC HumanResources.AddDepartment 'Refunds 2', '', @dept OUTPUT

    SELECT @dept

     

    EXEC HumanResources.AddDepartment 'Refunds 3', '', @dept OUTPUT

    SELECT @dept

     

    drop table HumanResources.Department

    drop procedure HumanResources.AddDepartment

    drop schema HumanResources

     

    [ ]s,

     

    Gustavo

    http://gustavomaiaaguiar.spaces.live.com
    quarta-feira, 7 de janeiro de 2009 17:43
  • Gustavo,

     

    Ele criou a procedure no Schema HumanResources e na hora de executar executou sem especifiar o esquema.

     

    Abraços

    quarta-feira, 7 de janeiro de 2009 17:48
  • Gabriel,

     

    Primeiramente, seja bem vindo ao fórum, esperamos poder ajudar da melhor forma possível, de acordo com a nossa disponibilidade e conhecimento. Faça parte desta grande comunidade, contribua com suas dúvidas, informações, dicas, nos ajudando a tornar o fórum uma grande fonte de aprendizagem.

     

    Em relação ao código da sua Stored Procedure, também não consegui identificar algo de errado, a única coisa que percebi foi que você esta executando a stored procedure sem informar o nome do esquema, mas isso a principio não deverá ocasionar falha no retorno do valor para a variável.

    quarta-feira, 7 de janeiro de 2009 17:55
  • Olá Júnior,

     

    Como o schema que ele especificou na criação da procedure não é o DBO, então é necessário especificar o schema ao executar a procedure.

     

    Abraços

     

    quarta-feira, 7 de janeiro de 2009 17:59
  • Então, a procedure não é problema, agora quando eu declaro qualquer variável e passo um valor pra ela, diz que preciso declarar a variável.

    Erro:
    Msg 137, Level 15, State 1, Line 1
    Must declare the scalar variable "@var".


    quarta-feira, 7 de janeiro de 2009 18:12
  • Olá Gabriel,

     

    No formato que você postou de criação e execução dá erro sim. No entanto, tenta assim:

     

    CREATE PROC HumanResources.AddDepartment

    @Name nvarchar(50), @GroupName nvarchar(50),

    @DeptID smallint OUTPUT

    AS

    INSERT INTO HumanResources.Department (Name, GroupName)

    VALUES (@Name, @GroupName)

    SET @DeptID = SCOPE_IDENTITY()

    GO

     

    DECLARE @dept int

    EXEC HumanResources.AddDepartment 'aaaa', '', @dept OUTPUT

    SELECT @dept

     

    Abraços

    quarta-feira, 7 de janeiro de 2009 18:17
  • Olá Demétrio Silva, como havia dito no post anterior, o problema está sobretudo na declaração da variável local. Quando eu declaro a variável, não dá erro, mas quando eu tento passar um valor para ela, diz que ela não está declarada.

    Tem alguma explicação para isso?? O código anterior eu copiei e colei de uma apostila do curso para certificação 70-431, o único problema é que não tem o schema declarado, mas não daria problema na variável né...
    quarta-feira, 7 de janeiro de 2009 22:18
  • É Demétrio, pelo visto não vai ter jeito, o cara não vai executar com o schema para agente ver se é esse o problema.

    Unf, paciência...
    quinta-feira, 8 de janeiro de 2009 11:28
  • Fabiano, eu executei com o schema, dá erro, diz que a variável não está declarada. Eu executei a procedure sem parâmetro antes e funcionou, porque não tinha que passar o parâmetro de saída pra variável que eu declarei (@dept). Quando coloquei o parâmetro de saída, a procedure não deixou de ser compilada, mas não executa devido a variável @dept não está declarada.

    Só que eu declaro a variável e a declaração não dá erro. Só na execução da procedure. Não consigo sequer passar um valor qualquer pra ela
    .

    Espero ter sido masi claro dessa vez, e desculpe alguma coisa.

    Obrigado
    quinta-feira, 8 de janeiro de 2009 13:38
  • Olá Gabriel,

     

    Se você executar esse código, do jeito que está aqui, ele funciona:

     

    Code Snippet

    CREATE PROC HumanResources.AddDepartment

    @Name nvarchar(50), @GroupName nvarchar(50),

    @DeptID smallint OUTPUT

    AS

    INSERT INTO HumanResources.Department (Name, GroupName)

    VALUES (@Name, @GroupName)

    SET @DeptID = SCOPE_IDENTITY()

    GO

     

    DECLARE @dept int

    EXEC HumanResources.AddDepartment 'aaaa', '', @dept OUTPUT

    SELECT @dept

     

     

     

    Abraços

     

    quinta-feira, 8 de janeiro de 2009 15:51
  • Olá Demétrio, copiei o código, mudei o contexto pra database AdventureWorks, dropei a a procedure antiga e executei. Ele cria e executa, mas não mostra a variável de saída como de costume, dá erro que a variável @dept não está declarada. Mas não tem problema não. Tentarei solucioná-la depois.

    Agradeço a todos o empenho em me ajudar.

    Abraços.
    quinta-feira, 8 de janeiro de 2009 20:56