Форматирование / экранирование запроса 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'.
Любая помощь или указатели по выходу из этого были бы очень благодарны - заранее спасибо за любую попытку прочитать!