Estamos tentando inserir dados do servidor remoto usando a consulta abaixo
if exists (select 1 from [ServerA].[DB_A].information_Schema.tables where table_name =MonthlyReportData')
begin
Insert into [ServerB].[DB_B].dbo.Monthlydata
select *,getdate() from
[ServerA].[DB_A].dbo.monthlydata
end
A consulta acima falha com o erro abaixo
O provedor OLE DB "SQLNCLI11" para o servidor vinculado "ServerA" não contém a tabela ""DB_A".."dbo",."MonthlyReportData"". A tabela não existe ou o usuário atual não tem permissões nessa tabela.
A tabela não existe, mas o que é estranho é a verificação da consulta do bloco 'begin', mesmo depois de existir falha
Se modificarmos a consulta abaixo, ela funcionará sem nenhum erro e a impressão 1 não será impressa
if exists (select 1 from [ServerA].[DB_A].information_Schema.tables where table_name =MonthlyReportData')
begin
print 1
end
se modificarmos ainda mais a consulta para, consultar uma tabela que existe, ela funciona, quero dizer que não vai mais longe após o begin
bloco
if exists (select 1 from [ServerA].[DB_A].information_Schema.tables where table_name =MonthlyReportData')
begin
Insert into [ServerB].[DB_B].dbo.Monthlydata
select *,getdate() from
[ServerA].[DB_A].dbo.validtable
end
No exemplo acima,no begin
bloco,observe existe funciona corretamente e não lança nenhum erro apenas quando você tem uma tabela válida no begin and end
bloco''
Espero ter explicado isso claramente.
Abaixo estão algumas coisas verificadas
1.O problema existe mesmo com information_schema.tables
2.Tentei isso também, mas sem ajuda: https://stackoverflow.com/questions/22182437/check-if-table-exists-in-external-linked-database
3.Account usado para conectar é Sysadmin
A resposta abaixo funciona quando eu uso uma única instrução e uso exec.Eu deveria ter me deixado claro, a consulta acima é gerada dinamicamente e passada para exec..veja o exemplo abaixo
set @Sql='
Insert into [server_A].[db_A].dbo.Monthlydata
select *,getdate() from ' +quotename(@dblocation)+'.'+quotename(cast(@dbname as varchar(20)))+'.dbo.MonthlyReportData
end'
exec(@sql)
Por favor, deixe-me saber se eu não estiver claro ou se você precisar de mais informações
Abaixo está meu código completo
DEclare @sql varchar(4000)
Declare @dblocation varchar(200)
declare @dbname varchar(200)
Declare Getdata cursor for
select dblocation,id
from
temp
open GetBMSdata
fetch next from Getdata into @dblocation,@dbname
while @@FETCH_STATUS=0
begin
set @Sql='
if exists (select 1 from '+quotename(@dblocation)+'.'+quotename(@dbname)+'dbo.MonthlyReportData)
begin
Insert into [servera].[dba].dbo.Monthlydata
select * from ' +quotename(@dblocation)+'.'+quotename(@dbname)+'dbo.MonthlyReportData
end'
exec(@sql)
fetch next from Getdata into @dblocation,@dbname
end
close Getdata
deallocate Getdata
Acabei modificando meu código como abaixo
set @Sql='
if exists (select 1 from '+quotename(@dblocation)+'.'+quotename(+Cast(@dbname as varchar(200)))+'.sys.tables where name='MonthlyReportData'')
begin
exec(
''
Insert into [serverb].dba_b.dbo.MonthlyReportData
select *,getdate() from ' +quotename(@dblocation)+'.'+quotename(+Cast(@dbname as varchar(200)))+'.dbo.MonthlyReportData
''
)
end
'
print @sql
exec(@sql)
A consulta inteira é validada pelo mecanismo antes de ser executada, portanto, a instrução IF não pode impedir essa mensagem para uma tabela que não existe.
Você pode usar sql dinâmico dentro do IF.
Após esclarecimento e amostra completa