我有许多与此类似的存储过程:
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)中使用结果,因此临时表的显式输入是(我很确定)是必需的。
答案 0 :(得分:4)
在存储过程中使用TRY / CATCH,您会发现问题存在特定的错误编号,因此请检查错误编号,如果是,则返回空结果集。正如您已经定义的表格更容易。
PseudoCode看起来像这样:
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服务器崩溃时不仅返回空结果集。
答案 1 :(得分: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].&[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