Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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
检查union sql server中是否存在数据库_Sql_Sql Server 2008 - Fatal编程技术网

检查union sql server中是否存在数据库

检查union sql server中是否存在数据库,sql,sql-server-2008,Sql,Sql Server 2008,我想从多个数据库联合查询。但在联合之前,我想检查数据库是否退出,然后是联合,如果第二个数据库退出,然后是联合,等等 IF EXISTS(SELECT * FROM sys.sysdatabases where name='FirstDB') select * from FirstDB.dbo.tablename union IF EXISTS(SELECT * FROM sys.sysdatabases where name='SecondDB') select * from SecondDB.

我想从多个数据库联合查询。但在联合之前,我想检查数据库是否退出,然后是联合,如果第二个数据库退出,然后是联合,等等

IF EXISTS(SELECT * FROM sys.sysdatabases where name='FirstDB')
select * from FirstDB.dbo.tablename
union
IF EXISTS(SELECT * FROM sys.sysdatabases where name='SecondDB')
select * from SecondDB.dbo.tablename.
如何做到这一点。
提前感谢。

在运行时选择数据库或表是代码的味道。这在你的情况下可能是有效的,但肯定是可疑的。如果您对所使用的数据库有任何控制,请考虑重新评估数据库设计。数据库是否在运行时创建和销毁?这几乎肯定是个坏主意。

在运行时选择数据库或表是一种代码味道。这在你的情况下可能是有效的,但肯定是可疑的。如果您对所使用的数据库有任何控制,请考虑重新评估数据库设计。数据库是否在运行时创建和销毁?这几乎肯定是个坏主意。

在每台服务器中定义一个具有固定名称的视图: 在FirstDB服务器中:

CREATE DATABASE SOME_DATABASE;
CREATE VIEW SOME_DATABASE.FIXED_TABLENAME AS SELECT * FROM FirstDB.dbo.tablename
CREATE DATABASE SOME_DATABASE;
CREATE VIEW SOME_DATABASE.FIXED_TABLENAME AS SELECT * FROM SecondDB.dbo.tablename
在SecondDB服务器中:

CREATE DATABASE SOME_DATABASE;
CREATE VIEW SOME_DATABASE.FIXED_TABLENAME AS SELECT * FROM FirstDB.dbo.tablename
CREATE DATABASE SOME_DATABASE;
CREATE VIEW SOME_DATABASE.FIXED_TABLENAME AS SELECT * FROM SecondDB.dbo.tablename
在任一数据库中的代码中:

SELECT * FROM SOME_DATABASE.FIXED_TABLENAME;

在每个服务器中定义具有固定名称的视图: 在FirstDB服务器中:

CREATE DATABASE SOME_DATABASE;
CREATE VIEW SOME_DATABASE.FIXED_TABLENAME AS SELECT * FROM FirstDB.dbo.tablename
CREATE DATABASE SOME_DATABASE;
CREATE VIEW SOME_DATABASE.FIXED_TABLENAME AS SELECT * FROM SecondDB.dbo.tablename
在SecondDB服务器中:

CREATE DATABASE SOME_DATABASE;
CREATE VIEW SOME_DATABASE.FIXED_TABLENAME AS SELECT * FROM FirstDB.dbo.tablename
CREATE DATABASE SOME_DATABASE;
CREATE VIEW SOME_DATABASE.FIXED_TABLENAME AS SELECT * FROM SecondDB.dbo.tablename
在任一数据库中的代码中:

SELECT * FROM SOME_DATABASE.FIXED_TABLENAME;
如果数据库丢失(不太理解),批处理将无法编译,因此代码将无法运行。这意味着任何数据库存在性测试都将失败

假设您确实有随机出现和消失的数据库,唯一“实用”的选项是动态SQL

...
IF DB_ID('FirstDB') IS NOT NULL
   SET @sql ='select * from FirstDB.dbo.tablename'

IF DB_ID('SecondDB') IS NOT NULL
   SET @sql =  @sql + CASE WHEN @sql = '' THEN '' ELSE 'union ' END +
                      'select * from SecondDB.dbo.tablename'
...
如果数据库丢失(不太理解),批处理将无法编译,因此代码将无法运行。这意味着任何数据库存在性测试都将失败

假设您确实有随机出现和消失的数据库,唯一“实用”的选项是动态SQL

...
IF DB_ID('FirstDB') IS NOT NULL
   SET @sql ='select * from FirstDB.dbo.tablename'

IF DB_ID('SecondDB') IS NOT NULL
   SET @sql =  @sql + CASE WHEN @sql = '' THEN '' ELSE 'union ' END +
                      'select * from SecondDB.dbo.tablename'
...

此数据库存在性测试是否首先根据OP ASQUESK?…或处理联合(如果两个数据库都存在)?此数据库存在性测试是否首先根据OP ASQUESK?…或处理联合(如果两个数据库都存在)?如果第一个数据库不存在,这将失败,因为@sql将是“UNION select…”,前面没有select语句。此如果第一个DB不存在,则将失败,因为@sql将是“Union select…”,前面没有select语句。