我有许多结构类似于此的存储过程:
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) 中使用结果,因此(我很确定)需要临时表的显式键入。
最佳答案
在您的存储过程中使用 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 服务器崩溃等情况下返回空结果集。
关于tsql - 如何在动态 SQL 中处理从 OpenQuery 调用到链接分析服务器的空结果集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2969734/