如何在动态 SQL 中处理从 OpenQuery 调用到链接分析服务器的空结果集?

Mr.*_*mar 3 t-sql ssas stored-procedures dynamic-sql openquery

我有许多与此结构类似的存储过程:

DECLARE @sql NVARCHAR(MAX)
DECLARE @mdx NVARCHAR(MAX)

CREATE table #result
(
  [col1] NVARCHAR(50),
  [col2] INT,
  [col3] INT
)

SET @mdx = '{some dynamic MDX}'
SET @sql = 'SELECT a.* FROM OpenQuery(LinkedAnalysisServer, ''' + @mdx + ''') AS a'

INSERT INTO #result
EXEC sp_executesql @sql
SELECT * FROM #result
Run Code Online (Sandbox Code Playgroud)

当多维数据集中存在结果时,这非常有效。但是,当 OpenQuery 结果为空时,INSERT 会失败并显示以下错误:

列名或提供的值数量与表定义不匹配。

我的问题是,处理这种情况的最佳方法是什么?我在静态报告文件 (.rdlc) 中使用结果,因此(我很确定)需要显式键入临时表。

Mef*_*eff 5

在您的存储过程中使用 TRY/CATCH,您会注意到您的问题有一个特定的错误号,因此请检查错误号,如果是,则返回一个空结果集。由于您已经定义了表格,因此会更容易。

伪代码看起来像这样:

SET @mdx = '{some dynamic MDX}'
SET @sql = 'SELECT a.* FROM OpenQuery(LinkedAnalysisServer, ''' + @mdx + ''') AS a'

BEGIN TRY

INSERT INTO #result
EXEC sp_executesql @sql

END TRY
BEGIN CATCH

  IF ERROR_NUMBER <> 'The error number you are seeing'
  BEGIN
    RAISERROR('Something happened that was not an empty result set')
  END

END CATCH

SELECT * FROM #result
Run Code Online (Sandbox Code Playgroud)

您需要检查该特定错误,以便在您的 SSAS 服务器崩溃时不只是返回空结果集。