我们的情况是,我们在两个单独的服务器上有两个版本的同一个数据库 - 两个站点各有一个。由于种种原因,目前将它们整合到一个数据库中是不可行的。
我们有很多SSRS报告,但每个报告都是重复的,所以我们希望有一个报告采用locationID并从相应的数据库中获取数据。
显而易见的方法当然是在locationID上有一个“IF”,然后复制只更改“FROM”子句的代码,但在我看来,这是一种非常糟糕的做事方式。
有没有办法在报告后面的SQL查询的“FROM”部分放置条件语句?
我们尝试过其他方式(表值函数,复制),但性能和速度总是不可接受的。 (两个报告需要大约2秒钟才能加载 - 1个带有表值函数的报告需要> 40秒)
(我还想补充一点,我不打算将它们放在单独的服务器上,我们现在无法改变它。)
答案 0 :(得分:0)
只需将数据集分开并为每个数据集创建表格/矩阵/图表?您只需添加第二个数据源,在数据集中具有相同的查询/ SP,并将每个数据集指向相应的服务器。
或许我在这里没有看到这个问题?
答案 1 :(得分:0)
鉴于您正在使用SSRS,因此选项有限,以下是一个肮脏的黑客,但可能适用于您的困境:
-- assumes @useDB1 bit field of 1 or 0
SELECT
Field1,
Field2,
Field3
FROM (
-- db1 table(s)
SELECT * FROM Table1 T
WHERE T.PrimaryKeyField IS NULL OR @useDB1 = 1
UNION ALL
-- db2 linked server
SELECT * FROM [db2Link].DatabaseName.dbo.Table1 T
WHERE T.PrimaryKeyField IS NULL OR @useDB1 = 0
) DB
-- other filters/grouping here
WHERE SomeOtherField = @someOtherParameter
子查询将不会为其中一个数据库返回任何行,具体取决于参数。我检查了查询优化器是否会干净利落地处理它,并且确实选择了所有字段时非常失望,尽管至少外部查询WHERE子句用于限制返回的行数。
如果表格不是太宽,或者你还需要所有的字段,那么从我的简短测试中对上述内容的影响不大。
如果您需要多个表上的字段或联接的子集,请考虑在两个数据库上创建一个视图以简化此操作,以便您仍然可以使用SELECT *
。