none
Problemas ao usar EXEC RRS feed

  • Pergunta

  • Alguem pode me ajudar??

    Estou fazendo uma query que verifica se duas tabelas possuem a mesma quantidade de linhas, os nomes das tabelas eu tenho que passar por parametros, porem aparece um erro na sintaxe do = e eu não consegui resolver.

    declare @tabela_atual varchar(100),
       @tabela_historico varchar(100)

    set @tabela_atual = 'tbl_produtos'
    set @tabela_historico = 'tbl_historico_produtos'


    if

    EXEC ('SELECT count(*) from empresa.dbo.'+@tabela_atual+'') = ('SELECT count(*) from empresa_historico.dbo.'+@tabela_historico+'')

    begin
    select 1 as igual

    end

    Aparece o seguinte erro: Incorrect syntax near '='.
    terça-feira, 13 de abril de 2010 14:40

Respostas

  •  

    Segue minha proposta, seguindo a tua linha de colocar toda a lógica dentro do EXEC. Funciona, mas na minha opinião fica um código dificil de dar manutenção.

    Abraço

     declare @tabela_atual varchar(100),
        @tabela_historico varchar(100)
    
     
     set @tabela_atual = 'Person.Person'
     set @tabela_historico = 'Sales.Customer'
    
    
     EXEC ( N'IF (SELECT count(*) from ' + @tabela_atual + ') = (SELECT count(*) from '+@tabela_historico + ') ' +  
    		' begin ' +  
    		' select 1 as igual ' +
    		' end ' + 
    		' else ' +
    		' begin ' +  
    		' select 0 as igual ' + 
    		' end ' )

    hã?
    • Marcado como Resposta LeticiaAmorim quarta-feira, 14 de abril de 2010 11:55
    quarta-feira, 14 de abril de 2010 00:31

Todas as Respostas

  • Leticia

    tenta assim

    declare @tabela_atual varchar(100),
       @tabela_historico varchar(100)
    
    set @tabela_atual = 'tbl_produtos'
    set @tabela_historico = 'tbl_historico_produtos'
    
    declare @resultTb1 int
    declare @resultTb2 int
    
    EXEC @resultTb1 ='SELECT count(1) from empresa.dbo.'+@tabela_atual
    EXEC @resultTb2 ='SELECT count(1) from empresa_historico.dbo.'+@tabela_historico
    
    
    if @resultTb1 = @resultTb2
    begin
        select 1 as igual
    end

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    terça-feira, 13 de abril de 2010 14:46
  • Tentei aquii...
    aparece a mensagem:

    Msg 102, Level 15, State 1, Line 10
    Incorrect syntax near 'SELECT count(1) from empresa.dbo.'.
    terça-feira, 13 de abril de 2010 14:52
  • Letícia boa tarde, segue uma sugestão.

    DECLARE @tabela_atual     VARCHAR(100),
            @tabela_historico VARCHAR(100)
    
    SELECT @tabela_atual     = 'tbl_produtos'
          ,@tabela_historico = 'tbl_historico_produtos'
    
    
    DECLARE @sql1 VARCHAR(2000) 
    
    SET @sql1 = 
    'SELECT
    CASE WHEN x.'+@tabela_atual+' > x.'+@tabela_historico+' 
         THEN ''a tabela '+@tabela_atual+' é maior''
         WHEN x.'+@tabela_atual+' < x.' + @tabela_historico + ' 
         THEN ''a tabela '+@tabela_historico+' é maior''
         ELSE ''ambas contem a mesma qtd de registro''
    END AS Resultado
    FROM (
    SELECT 
    (SELECT count(1) from empresa.dbo.'+@tabela_atual+') as '+@tabela_atual+',
    (SELECT count(1) from empresa_historico.dbo.'+@tabela_historico+') as '+@tabela_historico+'
    ) AS x'
    
    exec (@sql1)

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    terça-feira, 13 de abril de 2010 15:27
  • Leticia,

    Corrigindo meus script

    declare @tabela_atual varchar(100),
       @tabela_historico varchar(100), 
       @strSQL varchar(max), @sqlResult bit
    
    set @tabela_atual = 'tbl_produtos'
    set @tabela_historico = 'tbl_historico_produtos'
    
    set @strSQL = 'if (select COUNT(1) from empresa.dbo.'+@tabela_atual+')=(select COUNT(1) from empresa_historico.dbo.'+@tabela_historico+')
    begin
        select @result =1
    end
    else
    begin
        select @result =0
    end'
    
    declare @sqlStatement NVARCHAR(max)
    DECLARE @sqlParameters NVARCHAR(max)
    
    SET @sqlStatement = @strSQL
    SET @sqlParameters = '@result INT OUTPUT'
    
    EXEC sp_executesql @sqlStatement, @sqlParameters, @result = @sqlResult OUTPUT
    
    if @sqlResult=1
    begin
        select 1 as igual
    end

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    terça-feira, 13 de abril de 2010 16:07
  • Eu queria um jeito simples de fazer isso, achei complicado a forma que vcs colocaram!

    Sou iniciante!

     

    Essa é a idéia inicial da query!

    if

    (select count(*) from empresa.dbo.tbl_produtos) 

    (select count(*) from empresa_historico.dbo.tbl_historico_produtos)

     

    begin

    select 1 as igual

    end

     

     

    Mas os nomes das tabelas tem que ser passado atraves de variaveis!!

     

    Eu adaptei a forma inicial para:

     

     

    declare @tabela_atual varchar(100),

    @tabela_historico varchar(100)

     

    set @tabela_atual = 'tbl_produtos'

    set @tabela_historico = 'tbl_historico_produtos'

     

     

     

    exec ('(select COUNT(1) from empresa.dbo.'+@tabela_atual+')=(select COUNT(1) from empresa_historico.dbo.'+@tabela_historico+')')

     

    begin

    select 1 as igual

    end

     

     

    executando isso ocorreu a seguinte mensagem:

     

     

    Msg 102, Level 15, State 1, Line 1

    Incorrect syntax near '='.

     

    (1 row(s) affected)


    Eu testei duas tabelas com o número de linhas iguais, e retornou o igual = 1
    porem o problema na sintaxe continua!

     

    terça-feira, 13 de abril de 2010 16:59
  • Letícia simplifiquei o código, veja se lhe atende.

    DECLARE @tabela_atual     VARCHAR(100),
            @tabela_historico VARCHAR(100)
    
    SELECT @tabela_atual     = 'tbl_produtos'
          ,@tabela_historico = 'tbl_historico_produtos'
    
    
    DECLARE @Sql NVARCHAR(2000) 
    
    SET @Sql = N''
    SET @Sql = @Sql + N'SELECT CASE WHEN '
    SET @Sql = @Sql + N'(SELECT count(1) from empresa.dbo.    '       + @tabela_atual     + N' WITH(NOLOCK)) = '
    SET @Sql = @Sql + N'(SELECT count(1) from empresa_historico.dbo.' + @tabela_historico + N' WITH(NOLOCK))   '
    SET @Sql = @Sql + N' THEN 1 ELSE 0 END '
    
    PRINT @Sql
    EXEC SP_EXECUTESQL @Sql

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    terça-feira, 13 de abril de 2010 17:28
  • Tente assim.

    declare @tabela_atual varchar(100),
       @tabela_historico varchar(100)
    
    set @tabela_atual = 'tbl_produtos'
    set @tabela_historico = 'tbl_historico_produtos'
    
    declare @resultTb1 int
    declare @resultTb2 int
    
    EXEC @resultTb1 ='SELECT count(*) from empresa.dbo.'+@tabela_atual
    EXEC @resultTb2 ='SELECT count(*) from empresa_historico.dbo.'+@tabela_historico
    
    
    if @resultTb1 = @resultTb2
    begin
        select 1 as igual
    end
    

    Se ajudar, não esqueça que você pode votar como útil. :D
    terça-feira, 13 de abril de 2010 17:29
  •  

    Segue minha proposta, seguindo a tua linha de colocar toda a lógica dentro do EXEC. Funciona, mas na minha opinião fica um código dificil de dar manutenção.

    Abraço

     declare @tabela_atual varchar(100),
        @tabela_historico varchar(100)
    
     
     set @tabela_atual = 'Person.Person'
     set @tabela_historico = 'Sales.Customer'
    
    
     EXEC ( N'IF (SELECT count(*) from ' + @tabela_atual + ') = (SELECT count(*) from '+@tabela_historico + ') ' +  
    		' begin ' +  
    		' select 1 as igual ' +
    		' end ' + 
    		' else ' +
    		' begin ' +  
    		' select 0 as igual ' + 
    		' end ' )

    hã?
    • Marcado como Resposta LeticiaAmorim quarta-feira, 14 de abril de 2010 11:55
    quarta-feira, 14 de abril de 2010 00:31
  • Eu agradeço a colaboração de todos, todas as soluções que funcionaram eu marquei como util!
    Adaptei o codigo do DTito, e para o meu caso, foi a melhor solução!!


    declare @tabela_atual varchar(100),
       @tabela_historico varchar(100)

     
     set @tabela_atual = 'tbl_produtos'
     set @tabela_historico = 'tbl_produtos_historico'


     EXEC ( N'IF (SELECT count(*) from empresa.dbo.' + @tabela_atual + ') = (SELECT count(*) from empresa_historico.dbo.'+@tabela_historico + ') ' +  
    ' begin   
    select 1 as igual
    end 
    else 
    begin  
    select 0 as igual 
    end ' )

    Obrigado a TODOS!!
    quarta-feira, 14 de abril de 2010 11:54