Как обработать пустой набор результатов из вызова OpenQuery к связанному серверу анализа в динамическом SQL? - PullRequest
2 голосов
/ 04 июня 2010

У меня есть несколько хранимых процедур, структурированных так:

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), поэтому (я почти уверен) требуется явная типизация временной таблицы.

Ответы [ 2 ]

4 голосов
/ 16 июня 2010

Используйте 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.

0 голосов
/ 16 июля 2015

Существует другое решение этой проблемы, похожее на принятый ответ, которое предполагает использование оператора 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...