我想从多个数据库联合查询。但在联盟之前我想检查数据库是否退出然后联合,如果第二个数据库退出然后联合等等......
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.
如何做到这一点。 提前谢谢。
答案 0 :(得分:3)
如果数据库丢失(不太明白),批处理将无法编译,因此代码将无法运行。这意味着对数据库存在的任何测试都将失败。
假设您确实有数据库随机出现和消失,唯一的“实用”选项是动态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'
...
答案 1 :(得分:2)
在运行时选择数据库或表是代码味道。它可能在你的情况下有效,但它肯定是可疑的。如果您对正在使用的数据库有任何控制权,请考虑重新评估数据库设计。是否在运行时创建和销毁数据库?这几乎肯定是一个坏主意。
答案 2 :(得分:0)
在每个服务器中定义一个具有固定名称的视图: 在FirstDB服务器中:
CREATE DATABASE SOME_DATABASE;
CREATE VIEW SOME_DATABASE.FIXED_TABLENAME AS SELECT * FROM FirstDB.dbo.tablename
在SecondDB服务器中:
CREATE DATABASE SOME_DATABASE;
CREATE VIEW SOME_DATABASE.FIXED_TABLENAME AS SELECT * FROM SecondDB.dbo.tablename
在DB中的代码中:
SELECT * FROM SOME_DATABASE.FIXED_TABLENAME;