3

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

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

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

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

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

4

2 回答 2

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

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

于 2010-06-16T17:36:43.910 回答
0

这个问题还有另一个解决方案,类似于接受的答案,它涉及使用 IF 语句而不是 TRY...CATCH。

http://www.triballabs.net/2011/11/overcoming-openquery-mdx-challenges/

IF (SELECT COUNT(*)
    FROM OPENQUERY("SSAS1",
      'SELECT [Measures].[Target Places] ON COLUMNS
      FROM [ebs4BI_FactEnrolment]
      WHERE [DimFundingYear].[Funding Year].&amp;[17]')) > 0
  EXEC sp_executesql N'SELECT CONVERT(varchar(20),
  "[DimPAPSCourse].[Prog Area].[Prog Area].[MEMBER_CAPTION]")
  as ProgArea,
  convert(float, "[Measures].[Target Places]") as Target
  FROM OPENQUERY("SSAS1",
    ''SELECT [Measures].[Target Places] ON COLUMNS,
    [DimPAPSCourse].[Prog Area].[Prog Area] ON ROWS
    FROM [ebs4BI_FactEnrolment]
    WHERE [DimFundingYear].[Funding Year].&[17]'')'
ELSE
  SELECT '' as ProgArea, 0 as Target
  WHERE 1=0
于 2015-07-16T14:17:18.910 回答