这是一个非常具体和复杂的用例,但我和我的团队正在努力使我们的多维数据集部署体系结构在我们的链接服务器之间更加灵活(无需借助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;
我很难学会do some hackery to parameterize an OPENQUERY call。我正在努力将MDX查询嵌套在这个混乱中,所以我一直在回归:
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near 'CALL'.
任何有关逃避此事的帮助或指示都将非常感谢 - 提前感谢您尝试通读!