基于参数在数据库之间切换的单个查询

时间:2014-02-21 09:37:00

标签: sql sql-server-2008 reporting-services

我们的情况是,我们在两个单独的服务器上有两个版本的同一个数据库 - 两个站点各有一个。由于种种原因,目前将它们整合到一个数据库中是不可行的。

我们有很多SSRS报告,但每个报告都是重复的,所以我们希望有一个报告采用locationID并从相应的数据库中获取数据。

显而易见的方法当然是在locationID上有一个“IF”,然后复制只更改“FROM”子句的代码,但在我看来,这是一种非常糟糕的做事方式。

有没有办法在报告后面的SQL查询的“FROM”部分放置条件语句?

我们尝试过其他方式(表值函数,复制),但性能和速度总是不可接受的。 (两个报告需要大约2秒钟才能加载 - 1个带有表值函数的报告需要> 40秒)

(我还想补充一点,我不打算将它们放在单独的服务器上,我们现在无法改变它。)

2 个答案:

答案 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 *