Форматирование / экранирование запроса MDX в рамках вложенного вызова OPENQUERY

Это довольно конкретный и сложный сценарий использования, но мы с моей командой пытаемся сделать нашу архитектуру развертывания кубов гораздо более гибкой между нашими связанными серверами (не прибегая к PowerShell).

Я медленно пытался избавиться от жестко запрограммированных ссылок на серверы и столкнулся с довольно плохим блокировщиком.

Наш код выглядел примерно так и работал наполовину прилично, пока не попытался сделать его динамическим (с отступом для удобства чтения):

-- Run from DB_SRV1 as a stored procedure...

SELECT
...
FROM 
  OPENQUERY(DB_SRV2, 
            'SELECT * 
             FROM OPENQUERY(
                    SRV2_ANALYSISSERVICES_REPORT,
                    ''CALL ASSP.DiscoverXMLMetadataFull("Database\DataSources\DataSource");'')') a 
INNER JOIN 
    db_cache..tblCubeDBRelation b ON a.parent_databaseid=b.parent_databaseId
INNER JOIN 
    db_cache..tblCubeStatus on b.parent_databaseid=DatabaseName and SourceDatabaseName='SRV1'

Это отлично работало для обработки в двух фиксированных экземплярах служб Analysis Services для производственной среды, но оказалось довольно ограниченным для построения среды тестирования / разработки с несколькими экземплярами; тем более что мы можем более эффективно распределять потоки по каждому экземпляру во время обработки. Попытка сделать вложенные операторы OPENQUERY динамическими:

-- Run from DB_SRV1 as a stored procedure...

DECLARE @DBConn varchar(50);
DECLARE @ASDataSource nvarchar(50);
DECLARE @MDXQuery nvarchar(50);

-- Ideally configurable to run processing on any AS instance
-- Hard-coded for testing here...
SET @DBConn = 'SRV2_DB';
SET @ASDataSource = 'SRV2\ASInstance_v3';

DECLARE @DataSourceQuery nvarchar(max);
DECLARE @DataSourceResults nvarchar(max);
DECLARE @ParmDefinition nvarchar(500);

SET @ParmDefinition = '@s nvarchar(1000) OUTPUT';
SET @DataSourceQuery = 
      'SELECT * FROM OPENQUERY([' + @DBConn + '],
          ''SELECT * FROM OPENQUERY(
               ['+ @ASDataSource +'], 
               ''CALL ASSP.DiscoverXMLMetadataFull("Database\DataSources\DataSource");''))
          ''
      ';

EXECUTE sp_executesql
    @DataSourceQuery,
    @ParmDefinition,
    @S = @DataSourceResults OUTPUT;
    SELECT @DataSourceResults;

Я усвоил тяжелый способ, которым вы должны сделать некоторую хакерскую попытку для параметризации вызова OPENQUERY. Я борюсь с вложением запроса MDX в этот беспорядок, поэтому я последовательно возвращаюсь:

Msg 102, Level 15, State 1, Line 3
Incorrect syntax near 'CALL'.

Любая помощь или указатели по выходу из этого были бы очень благодарны - заранее спасибо за любую попытку прочитать!

0 ответов

Другие вопросы по тегам