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 个问题:
- 是否可以从 SSAS 分区查询内部查询另一个数据库(在同一台服务器上)?
- 如果没有,有什么方法可以在查询中使用变量作为数据库名称,并根据项目配置更新该变量 (Dev,Tst,Prd)
奖金问题:我找不到太多关于这样做的原因是因为我忽略了这显然是个坏主意,如果是这样,为什么?
如何创建第二个指向 DW_Custom 数据库(或在您要部署到的特定环境中调用的任何内容)的 SSAS 数据源?然后,当您从 Dev 部署到 Prod 时,您只需要更改该连接字符串。创建分区时,指定 DW_Custom 数据源,然后指定不带数据库名称的查询:
SELECT * FROM [dbo].[CubePartition](@StartDate, @EndDate)
只要 table-valued 函数的查询计划与普通 SELECT 语句相比是高效的,那么我认为这没有问题。
@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 个问题:
- 是否可以从 SSAS 分区查询内部查询另一个数据库(在同一台服务器上)?
- 如果没有,有什么方法可以在查询中使用变量作为数据库名称,并根据项目配置更新该变量 (Dev,Tst,Prd)
奖金问题:我找不到太多关于这样做的原因是因为我忽略了这显然是个坏主意,如果是这样,为什么?
如何创建第二个指向 DW_Custom 数据库(或在您要部署到的特定环境中调用的任何内容)的 SSAS 数据源?然后,当您从 Dev 部署到 Prod 时,您只需要更改该连接字符串。创建分区时,指定 DW_Custom 数据源,然后指定不带数据库名称的查询:
SELECT * FROM [dbo].[CubePartition](@StartDate, @EndDate)
只要 table-valued 函数的查询计划与普通 SELECT 语句相比是高效的,那么我认为这没有问题。