2010-06-03 43 views
2

我有很多的结构类似于此存储过程:如何在动态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 

这工作得很好时,导致立方体存在。然而,当OPENQUERY结果是空的,INSERT失败,此错误:

Column name or number of supplied values does not match table definition.

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

回答

4

在您的存储过程中使用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服务器崩溃的例子。

+1

只是为了完整起见,我会注意,括号是必需的ERROR_NUMBER(),而在这种情况下,返回的数字是213 我的临时解决方法是删除动态MDX查询中我的ROWS和COLUMNS坐标轴上的NON EMPTY(),但这并不理想,因为它返回的空/稀疏表格很难看。 这很好用,谢谢。 – 2010-06-18 00:32:52

+0

啊,是的,谢谢澄清 - 我是从内存写在家里:) – Meff 2010-06-18 07:51:40

+0

@MrPalomar,我也使用了“Catch/ReThrow”技术在这里解释:http://stackoverflow.com/questions/1673892/is-there -sql-to-cs-throw-to-re-throw-exceptions为了使上层的异常“冒泡起来”你有密码,或者查询有错误,等等。 – Meff 2010-06-18 07:54:33

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 
相关问题