SSAS 多维 - Table 值函数作为分区查询

SSAS Multidimensional - Table Value Function as a Query for Partition

@GregGalloway was able to answer the question I should have asked. I am adding a more concise question here, while maintaining the original lengthy text

How do I use a table valued function as the query for a partition, when the function is in separate database from my fact and referenced dimensions?

概述:我正在构建一个 SSAS 多维立方体,它基于我们应用程序数据仓库中的单个事实 table,并希望将 table 值函数的结果集用作我的事实 table 的分区查询。我们正在使用 SQL 服务器(和 SSAS)2014

条件:对于每个环境(Dev、Tst、Prd),同一台服务器上有 2 个独立的数据库,一个用于应用程序数据仓库 [DW_App],另一个用于自定义对象 [DW_Custom]。我不能在 [DW_App] 中创建任何对象,但在 [DW_Custom]

中有很大的自由度

背景信息:我找不到太多关于以这种方式使用 TVF 和分区的信息。我的想法是,它将通过给我一个单一的地方来更新 SQL if/when 我修改事实 table.

来帮助简化未来的开发

因此,在测试我使用 TVF 作为分区查询的疯狂想法时,我 运行 遇到了一些难题。当我在 FROM 子句中明确声明数据库时,我可以使用我的 TVF。

SELECT * FROM [DW_Custom].[dbo].[CubePartition](@StartDate, @EndDate)

但是这样是行不通的,因为cube在生产前会部署在多个环境中,需要分别指向不同的DB。所以我尝试添加一个新的数据源,将我的分区查询设置为指向新的数据源,然后删除数据库名称。即:

SELECT * FROM [dbo].[CubePartition](@StartDate, @EndDate)

我得到一个错误

The SQL syntax is not valid. The relational database returned the following error message: Deferred prepare could not be completed. Invalid object name 'dbo.CubePartition'

如果我点击此错误和后续关于多维数据集无法处理的警告,如果我继续,我能够构建和部署多维数据集。但是我无法处理它,因为我得到一个错误,我的维度之一不存在。 查看生成的查询,很明显它正在查询我的维度和事实,这些维度和事实不存在于“[DW_Custom]”中,这很好地解释了该错误。

所以我猜有 2 个问题:

  1. 是否可以从 SSAS 分区查询内部查询另一个数据库(在同一台服务器上)?
  2. 如果没有,有什么方法可以在查询中使用变量作为数据库名称,并根据项目配置更新该变量 (Dev,Tst,Prd)

奖金问题:我找不到太多关于这样做的原因是因为我忽略了这显然是个坏主意,如果是这样,为什么?

如何创建第二个指向 DW_Custom 数据库(或在您要部署到的特定环境中调用的任何内容)的 SSAS 数据源?然后,当您从 Dev 部署到 Prod 时,您只需要更改该连接字符串。创建分区时,指定 DW_Custom 数据源,然后指定不带数据库名称的查询:

SELECT * FROM [dbo].[CubePartition](@StartDate, @EndDate)

只要 table-valued 函数的查询计划与普通 SELECT 语句相比是高效的,那么我认为这没有问题。