tsql - 如何在动态 SQL 中处理从 OpenQuery 调用到链接分析服务器的空结果集?

标签 tsql stored-procedures ssas 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

当结果存在于多维数据集中时,这非常有效。但是,当 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/

相关文章:

TSQL 消息 1013 "Use correlation names to distinguish them."

sql-server - 创建一个存储过程来聚合行

sql - 存储过程范围: using sp from another database

单 View SQL SSAS Cube,处理cube时获取属性键找不到?

sql-server - MDX - 检索当前在 where 子句中使用的成员级别

sql-server - 在 SSRS 中,有没有办法在单元格之间复制格式?

sql - 如何从链接服务器调用标量用户定义函数?

sql-server-2005 - 查询以查找包含日期列的所有表

sql-server - 跨行拆分单行

sql - 如何向 mysql 5 存储过程中运行的查询传递限制?