Sql server 基于@servername连接表
如何使用条件语句(或任何其他解决方案)确定是否引用可能存在或不存在的数据库 我创建了一个多服务器查询,可以正确地从两个不同服务器上的同一数据库返回数据。但是,Server2包含一个在Server1上不存在的辅助数据库。我还需要从该数据库返回一个值,如果它存在的话 以下Case语句用作Server1的列,因为该服务器上存在引用的数据库。在Server2上运行时,我甚至希望第二个When子句不会被计算,但我收到一个引用不存在的数据库的“无效对象名”错误Sql server 基于@servername连接表,sql-server,conditional-statements,Sql Server,Conditional Statements,如何使用条件语句(或任何其他解决方案)确定是否引用可能存在或不存在的数据库 我创建了一个多服务器查询,可以正确地从两个不同服务器上的同一数据库返回数据。但是,Server2包含一个在Server1上不存在的辅助数据库。我还需要从该数据库返回一个值,如果它存在的话 以下Case语句用作Server1的列,因为该服务器上存在引用的数据库。在Server2上运行时,我甚至希望第二个When子句不会被计算,但我收到一个引用不存在的数据库的“无效对象名”错误 CASE WHEN @@SERVERN
CASE
WHEN @@SERVERNAME = 'Server2'
THEN 'N/A'
WHEN @@SERVERNAME = 'Server1'
THEN (SELECT Column1 FROM databasename.Table1
WHERE Column1 = a.column1)
END AS 'AliasName'
Self注意:when子句似乎是经过计算的,即使它没有通过逻辑测试部分
[如果不明显,a.column1引用指向主(外部)查询]
有人能创造性地解决这个问题吗?根据我得到的反馈,以下是我自己问题的答案:
SQL在执行点被解析和编译。如果您在尝试运行该语句时引用了一个不存在的对象,它将失败。即使无法执行该语句/表达式也无关紧要,整个语句必须有效。如果需要在不同的环境中运行不同的语句,您需要确保您的应用程序/实例针对所述环境具有不同的语句,或者使用动态SQL,以便根据环境创建和执行有效的语句。T-SQL实际上是一种编译语言,即使编译正在进行,因此,在查询中包含一个不存在的对象通常是不起作用的——异常是一个存储过程,其中编译将被延迟,但如果对象不存在,即使在执行时编译也会失败。使用动态SQL(如果这是一次性的)或重写此查询以使用始终存在的视图或函数,但在
Server2
上不返回任何内容。一个选项是创建一个执行查询的存储过程或视图,从而在两台服务器之间有所不同,但可以使用与代码相同的方式调用。