Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 基于@servername连接表_Sql Server_Conditional Statements - Fatal编程技术网

Sql server 基于@servername连接表

Sql server 基于@servername连接表,sql-server,conditional-statements,Sql Server,Conditional Statements,如何使用条件语句(或任何其他解决方案)确定是否引用可能存在或不存在的数据库 我创建了一个多服务器查询,可以正确地从两个不同服务器上的同一数据库返回数据。但是,Server2包含一个在Server1上不存在的辅助数据库。我还需要从该数据库返回一个值,如果它存在的话 以下Case语句用作Server1的列,因为该服务器上存在引用的数据库。在Server2上运行时,我甚至希望第二个When子句不会被计算,但我收到一个引用不存在的数据库的“无效对象名”错误 CASE WHEN @@SERVERN

如何使用条件语句(或任何其他解决方案)确定是否引用可能存在或不存在的数据库

我创建了一个多服务器查询,可以正确地从两个不同服务器上的同一数据库返回数据。但是,Server2包含一个在Server1上不存在的辅助数据库。我还需要从该数据库返回一个值,如果它存在的话

以下Case语句用作Server1的列,因为该服务器上存在引用的数据库。在Server2上运行时,我甚至希望第二个When子句不会被计算,但我收到一个引用不存在的数据库的“无效对象名”错误

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是一种编译语言。我知道这一点,但没有想到它的含义。查询中的所有对象都必须实际存在,即使该部分查询可能没有实际运行
  • 最好的解决方案是在特定于该数据库的每台服务器上创建一个视图或存储过程。它们应该返回相同数量的列。例如:如果服务器1返回的数据在服务器2上不存在,则来自服务器2的SP应该为该数据包含一个空白或空列。然后从多服务器连接调用每个数据库,以返回并加入每个数据库中的信息

  • SQL在执行点被解析和编译。如果您在尝试运行该语句时引用了一个不存在的对象,它将失败。即使无法执行该语句/表达式也无关紧要,整个语句必须有效。如果需要在不同的环境中运行不同的语句,您需要确保您的应用程序/实例针对所述环境具有不同的语句,或者使用动态SQL,以便根据环境创建和执行有效的语句。T-SQL实际上是一种编译语言,即使编译正在进行,因此,在查询中包含一个不存在的对象通常是不起作用的——异常是一个存储过程,其中编译将被延迟,但如果对象不存在,即使在执行时编译也会失败。使用动态SQL(如果这是一次性的)或重写此查询以使用始终存在的视图或函数,但在
    Server2
    上不返回任何内容。一个选项是创建一个执行查询的存储过程或视图,从而在两台服务器之间有所不同,但可以使用与代码相同的方式调用。