J'ai un certain nombre de procédures stockées de structure similaire à ceci:Comment gérer un ensemble de résultats vide d'un appel OpenQuery au serveur d'analyse lié en SQL dynamique?
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
Cela fonctionne très bien lorsque les résultats existent dans le cube. Cependant, lorsque les résultats de Openquery sont vides, l'INSERT échoue avec cette erreur:
Column name or number of supplied values does not match table definition.
Ma question est, quelle est la meilleure façon de gérer ce scénario? J'utilise les résultats dans un fichier de rapport statique (.rdlc), donc le typage explicite de la table temporaire est (j'en suis sûr) requis.
Juste pour être complet, je note que les parenthèses sont nécessaires sur ERROR_NUMBER(), et que le nombre retourné dans ce cas est 213. Ma solution temporaire était de supprimer le NON EMPTY() sur mes axes ROWS et COLUMNS dans la requête MDX dynamique, mais ce n'était pas idéal car les tables vides/sparse qu'il retournait étaient moche. Cela fonctionne beaucoup plus bien, merci. –
Ah oui, merci pour clarifier - j'écrivais ça à la maison de la mémoire :) – Meff
@MrPalomar, aussi j'ai utilisé la technique "Catch/ReThrow" expliquée ici: http://stackoverflow.com/questions/1673892/is-there -an-equivalent-in-t-sql-to-cs-throw-to-re-throw-exceptions afin de "Bubble Up" l'exception aux couches supérieures, de sorte que vous pouvez dire si le serveur SSAS a planté, ou si vous avez le mot de passe Wring, ou si la requête a une erreur, et ainsi de suite. – Meff