Usuário com melhor resposta
Problemas ao usar EXEC

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'ifEXEC ('SELECT count(*) from empresa.dbo.'+@tabela_atual+'') = ('SELECT count(*) from empresa_historico.dbo.'+@tabela_historico+'')beginselect 1 as igualendAparece o seguinte erro: Incorrect syntax near '='.
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
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!!! -
-
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 -
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!!! -
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 = 1porem o problema na sintaxe continua! -
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 -
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 -
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
-
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 + ') ' +' beginselect 1 as igualendelsebeginselect 0 as igualend ' )Obrigado a TODOS!!