代码在运行之前被解析。当它被解析时,SQL Server 检查它是否可以访问代码中的所有内容,它无法访问其他服务器上存在的数据库,因此运行代码的解析步骤失败。结果,您会收到显示的错误消息。
如果你想解决这个问题,你可以将 IF 块中的代码作为动态执行的代码(我总是觉得这有点像 hack/workaround)。
DECLARE @sql NVARCHAR(4000);
if ((select @@servername) = 'ServerA')
begin
SET @sql = 'use DatabaseA; select top 5 * from dbo.SignUPRequest;'
end
else if ((select @@servername) = 'ServerB')
begin
SET @sql = 'use DatabaseB; select top 5 * from dbo.SignUPRequest'
end
EXEC (@sql)
因此,这里发生的情况是,您推迟了使用适当数据库为服务器运行时间的代码的解析和运行,就像最后的 EXEC 语句所做的那样。
更新
根据下面的附加评论,您还可以将其重写为:
DECLARE @sql NVARCHAR(4000);
if ((select @@servername) = 'ServerA')
begin
select top 5 * from DatabaseA.dbo.SignUPRequest;
end
else if ((select @@servername) = 'ServerB')
begin
select top 5 * from DatabaseB.dbo.SignUPRequest;
end
因此,USE <database-name>
您还可以在 select 语句中更全面地限定表的名称,而不是在开头添加 a。如果你只有一行 SQL 来处理这可能会更有效。