Mr.*_*mar 3 t-sql ssas stored-procedures dynamic-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
Run Code Online (Sandbox Code Playgroud)
当多维数据集中存在结果时,这非常有效。但是,当 OpenQuery 结果为空时,INSERT 会失败并显示以下错误:
列名或提供的值数量与表定义不匹配。
我的问题是,处理这种情况的最佳方法是什么?我在静态报告文件 (.rdlc) 中使用结果,因此(我很确定)需要显式键入临时表。
在您的存储过程中使用 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
Run Code Online (Sandbox Code Playgroud)
您需要检查该特定错误,以便在您的 SSAS 服务器崩溃时不只是返回空结果集。