【问题标题】:SSRS How to do a cross database join without hardcoding the database name in the report querySSRS 如何在不硬编码报表查询中的数据库名称的情况下进行跨数据库连接
【发布时间】:2013-10-29 16:46:38
【问题描述】:

我有一个 SSRS 报告,它在其查询中连接到两个数据库。

SELECT table
FROM MainDB1.DBO.Table AS table1
JOIN MainDB2.DBO.Table AS table2 ON table1.ID = table2.ID

它正在使用 SSRS 数据源连接到其服务器。当我想编辑报告时,我必须在单独的服务器上进行,该服务器具有相同的数据库,但它们的名称不同。

我必须手动编辑查询使其看起来像这样才能更改报告

SELECT table
FROM DevDB1.DBO.Table AS table1
JOIN DevDB2.DBO.Table AS table2 ON table1.ID = table2.ID

每个报表服务器数据源都同名并在报表中引用。

数据集中有没有办法加入这两个数据库?或者有没有人有自己的方式来处理这个问题?这将使这个过程更有效率。

谢谢

【问题讨论】:

  • 当我想编辑报告时,我必须在单独的服务器上进行? 为什么?您不能在生产服务器上编辑报告吗?另外,如果您的开发服务器和生产服务器使用相同的数据库名称,这不是更有用吗?当然,这引起的问题不仅仅是开发报告吗?最后,Ctrl+H 在您的查询中查找和替换MainDB1DevDB1MainDB2DevDB2 真的那么费力吗?
  • 处理此问题的最简洁方法是在您的环境之间使用一致的数据库、模式和对象名称。其他任何事情都会导致各种问题,并且几乎没有任何好处……那为什么要这样做呢?如果这不是您的决定,一个潜在的解决方法是为DB2 in DB1... 中的每个引用对象创建一个SYNONYM,然后重新编写查询以使用同义词,以便不需要跨数据库引用...然后您的查询可以只使用两部分名称,并让每个环境的连接确定它是Dev 还是Main
  • 肯定可以有一致的数据库、模式和对象名称,但链接服务器采用的服务器名称在生产、测试​​和开发环境之间很少(我希望)相同。 SYNONYM 方法是我发现的最好的方法,因为它允许我们测试部署和迁移脚本并在环境之间移动它们而无需编辑它们。只需制作单独的脚本来为每个环境创建同义词。
  • @JC。链接服务器不一定需要采用服务器名称...使用sp_addlinkedserver@datasrc 参数是服务器名称,但@server 参数可以随心所欲地调用...这就是您的方式在代码中引用链接服务器。使用这些参数,您的链接服务器可以在环境之间具有一致的名称,但指向每个位置的完全不同的服务器。

标签: sql reporting-services datasource


【解决方案1】:

您应该遵循 Michael Fredrickson 的建议,即在您的环境中使用一致的命名并为您的链接服务器使用服务器别名以保持这种一致性。

话虽如此,考虑到您的环境方式,我建议使用基于表达式的 Sql 语句,该语句使用隐藏参数来实现您想要的。于是设置了两个隐藏字符串参数:

@Db1 默认为DevDB1@Db2 默认为DevDb2

现在为您的 Sql 语句使用以下表达式:

="SELECT table "
&"FROM " + Parameters!Db1.Value + ".DBO.Table AS table1 "
&"JOIN " + Parameters!Db2.Value + ".DBO.Table AS table2 ON table1.ID = table2.ID"

这会根据数据库参数的值构建正确的 Sql。

部署到 Reporting Services 服务器后,进入服务器并编辑参数:

@Db1 默认为MainDB1@Db2 默认为MainDB2

随后重新部署报表时,本地参数默认值不会覆盖服务器上已更改的默认值,因此这些服务器值将保持您设置的状态。

当人们运行报表时,他们不会看到隐藏的参数。它们只是在本地用于开发和在服务器上用于生产具有不同的设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    相关资源
    最近更新 更多