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

この問題には、TRY...CATCH の代わりに IF ステートメントを使用することを含む、受け入れられた回答と同様の別の解決策があります。

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 に答える