我们正在尝试使用以下查询从远程服务器插入数据
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
以上查询失败并出现以下错误
链接服务器“ServerA”的 OLE DB 访问接口“SQLNCLI11”不包含表“DB_A”、“dbo”、“MonthlyReportData”。该表不存在或当前用户对该表没有权限。
表不存在,但奇怪的是查询检查“开始”块,即使存在失败
如果我们将查询修改为以下,它会在没有任何错误的情况下工作并且不会打印 print 1
if exists (select 1 from [ServerA].[DB_A].information_Schema.tables where table_name =MonthlyReportData')
begin
print 1
end
begin
如果我们进一步修改查询,查询一个存在的表,它就可以工作,我的意思是它在块之后不会再进一步
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
在上面的例子中,在块中,observe exists 工作正常并且只有当你在块中有一个有效的表时才begin
不会抛出任何错误''begin and end
希望我解释清楚。
以下是检查的几件事
1.即使使用 information_schema.tables 也存在问题 2.也
试过这个,但没有帮助:https
://stackoverflow.com/questions/22182437/check-if-table-exists-in-external-linked-database
3.Account用于连接的是 Sysadmin
当我使用单个语句并使用 exec 时,下面的答案有效。我应该让自己清楚,上面的查询是动态生成并传递给 exec 的。请参见下面的示例
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)
如果我不清楚或您需要任何进一步的信息,请告诉我
下面是我的完整代码
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
我最终像下面这样修改了我的代码
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)
整个查询在运行之前由引擎验证,因此 IF 语句无法阻止针对不存在的表的消息。
您可以在 IF 中使用动态 sql。
澄清和全样后