none
Must declare the scalar variable na procedure

    Question

  •  

    Caros colegas,

    Criei a seguinte procedure:

     

     

    CREATE PROCEDURE [dbo].[sp_rs_subcontratos_datas]

     

      @c_projeto INT

    , @c_area VARCHAR(3)

    , @c_pac_sub_pac INT

    , @c_seq_oc INT

    , @c_seq_rco INT

    , @c_fornecedor INT

    , @dt_inicio_previsto DATETIME

     

    AS

    BEGIN

     

    DECLARE @strSQL AS VARCHAR(1000)

    SET NOCOUNT ON;

     

    SET @strSQL = 'SELECT Projeto

    , Área

    , Pacote

    , [Sub pac]

    , [Seq RCO]

    , [Rev RCO]

    , [ Seq OC] AS "Seq Oc"

    , [Rev OC]

    , Fornecedor

    , escopo AS Escopo

    , [Inicio Contratual] AS "Início Contratual"

    , [Fim Contratual] AS "Fim Contratual"

    , Evento

    , Descrição

    , Situação

    , Ação

    , [Inicio Previsto] AS "Início Previsto"

    , [Fim Previsto]

    , Alteração

    , [Inicio Real] AS "Início Real"

    , [Fim Real]

    , [Previsao Entrega] AS "Previsão Entrega"

    , Entrega

    FROM dbo.v_r_subcontratos

    WHERE reg_proj IN (@c_projeto) '

    IF (@c_area IS NOT NULL)

    BEGIN

    SET @strSQL = @strSQL + 'AND Área IN (@c_area) '

    END

    IF (@c_pac_sub_pac IS NOT NULL)

    BEGIN

    SET @strSQL = @strSQL + 'AND reg_pac IN (@c_pac_sub_pac) '

    END

    IF (@c_seq_oc IS NOT NULL)

    BEGIN

    SET @strSQL = @strSQL + 'AND [ Seq OC] IN (@c_seq_oc) '

    END

    IF (@c_seq_rco IS NOT NULL)

    BEGIN

    SET @strSQL = @strSQL + 'AND [Seq RCO] IN (@c_seq_rco) '

    END

    IF (@c_fornecedor IS NOT NULL)

    BEGIN

    SET @strSQL = @strSQL + 'AND reg_forn IN (@c_fornecedor) '

    END

    IF (@dt_inicio_previsto IS NOT NULL)

    BEGIN

    SET @strSQL = @strSQL + 'AND [Inicio Previsto] >= @dt_inicio_previsto '

    END

    END

    EXECUTE (@strSQL)

     

    Ao executar esta dando o seguinte erro:

     

    Msg 137, Level 15, State 2, Line 25

    Must declare the scalar variable "@c_projeto".

     

    Alguém pode me auxiliar na solução do mesmo

     

    Atenciosamente

     

    Tuesday, November 25, 2008 4:10 PM

Answers

  • Boa Tarde Neider,

     

    Antes de propriamente falar do seu problema, eu sugiro que você retire o prefixo sp_ de suas procedures. Esse prefixo não deve ser utilizado, pois, toda vez que uma procedure inicia com sp_ ele será pesquisa primeiramente no banco MASTER para depois ser pesquisada no banco atual. Isso pode provocar queda de desempenho desnecessária. Tente colocar outro prefixo como spu, Usp, etc.

     

    A declaração de variáveis é válida por batch e por sessão. Fora de um batch ou de uma sessão elas perdem o escopo. Como SQL dinâmicas criam uma nova sessão, as variáveis não serão vistas dentro da SQL dinâmica (essa é uma das suas fortes desvantagens). Você terá que passar o valor diretamente para a SQL dinâmica, ex:

     

    Code Snippet
    SET
    @strSQL = @strSQL + 'AND Área IN (' + @c_area + ')'

     

    Se o parâmetro for um string, o trabalho é um pouco maior, pois, as aspas precisam estar asseguradas. Ex:

     

    Code Snippet

    SET @strSQL = @strSQL + 'AND Área IN (' char(39) + @c_area + char(39) ')'

    -- Ou

    SET @strSQL = @strSQL + 'AND Área IN (' + '''' + @c_area + '''' + ')'

     

    Lembre-se de proteger-se contra o SQL Injection já que está utilizando SQL dinâmicas.

     

    [ ]s,

     

    Gustavo

    Tuesday, November 25, 2008 4:18 PM
    Moderator

All replies

  • Boa Tarde Neider,

     

    Antes de propriamente falar do seu problema, eu sugiro que você retire o prefixo sp_ de suas procedures. Esse prefixo não deve ser utilizado, pois, toda vez que uma procedure inicia com sp_ ele será pesquisa primeiramente no banco MASTER para depois ser pesquisada no banco atual. Isso pode provocar queda de desempenho desnecessária. Tente colocar outro prefixo como spu, Usp, etc.

     

    A declaração de variáveis é válida por batch e por sessão. Fora de um batch ou de uma sessão elas perdem o escopo. Como SQL dinâmicas criam uma nova sessão, as variáveis não serão vistas dentro da SQL dinâmica (essa é uma das suas fortes desvantagens). Você terá que passar o valor diretamente para a SQL dinâmica, ex:

     

    Code Snippet
    SET
    @strSQL = @strSQL + 'AND Área IN (' + @c_area + ')'

     

    Se o parâmetro for um string, o trabalho é um pouco maior, pois, as aspas precisam estar asseguradas. Ex:

     

    Code Snippet

    SET @strSQL = @strSQL + 'AND Área IN (' char(39) + @c_area + char(39) ')'

    -- Ou

    SET @strSQL = @strSQL + 'AND Área IN (' + '''' + @c_area + '''' + ')'

     

    Lembre-se de proteger-se contra o SQL Injection já que está utilizando SQL dinâmicas.

     

    [ ]s,

     

    Gustavo

    Tuesday, November 25, 2008 4:18 PM
    Moderator
  • Valeu Gustavo

    Deu certo

     

    Obrigado

     

    Tuesday, November 25, 2008 4:38 PM