我需要在具有不同数据库名称但具有相同表格和数据的2个不同服务器中执行脚本。为此, 我尝试使用以下语句。使用带条件语句的数据库
if (@@servername= 'srvrA')
begin
use dbA
end
else
begin
use dbB
end
但srvrB,它说数据库分贝不存在。
有人可以帮我实现这个吗?
我需要在具有不同数据库名称但具有相同表格和数据的2个不同服务器中执行脚本。为此, 我尝试使用以下语句。使用带条件语句的数据库
if (@@servername= 'srvrA')
begin
use dbA
end
else
begin
use dbB
end
但srvrB,它说数据库分贝不存在。
有人可以帮我实现这个吗?
一个更多的选择
添加链接的服务器登录本地实例和远程服务器之间sp_addlinkedserver
喜欢的东西:
sp_addlinkedserver
@server= N'srvrA',
@srvproduct= N'',
@provider= N'SQLNCLI',
@datasrc= N'srvrA';
sp_addlinkedsrvlogin
@rmtsrvname = 'srvrA' ,
@useself = 'FALSE' ,
@locallogin = 'your_local_login' ,
@rmtuser = 'your_remote_login' ,
@rmtpassword = 'your_password'
然后你的脚本看起来像
DECLARE @@srvname nvarchar(10) = 'srvrA'
IF (@@servername = @@srvname)
BEGIN
SELECT *
FROM srvrA.dbA.your_schema.your_table
END
ELSE
BEGIN
SELECT *
FROM srvrB.dbB.your_schema.your_table
END
如果启用SQLCMD模式,则可以实现您的目标。从sql管理工作室的查询菜单中切换SQLCMD模式。然后下面的脚本将工作。
if (@@servername = 'srvrA')
begin
:setvar dbname dbA
use $(dbname)
end
else
begin
:setvar dbname dbB
use $(dbname)
end
这不起作用。在执行脚本之前设置SQLCMD变量。 'dbname'将始终是最后一个':setvar'的值 –
对于这样的问题,我怀疑这可能是特定的数据库,所以可能值得增加了对您所使用的数据库引擎的标签。 – PeterJ
我刚刚进行了一项实验,问题是即使表达式计算结果为false,dbA的存在也会被检查。我认为这是在EXEC声明中的工作,但进一步检查它没有改变数据库,它仍然使用默认值。我猜如果没有好的解决方案出现,你可以创建一个空的数据库模式来解决它。或者可以在命令行上调用指定数据库的脚本,并完全删除USE。 – PeterJ