0

我是 SSIS 的新手,正在为脚本任务苦苦挣扎。试图弄清楚如何为以下场景构建脚本。

这是场景

我有 XML 文件有以下数据

<?xml version="1.0" encoding="utf-8"?> 
<environments>   
<environment>  
<name>DEV3WEB</name> 
<databaseservername>DEV3DB.apc.com</databaseservername
<webservername>DEV3WEB.abc.com/</webservername>
<appservername>DEV3APP.abc.com</appservername>
</environment>
<environment>   
<name>DEV3APP</name>
<databaseservername>DEV3DB.abc.com</databaseservername
<webservername>DEV3WEB.abc.com/</webservername
<appservername>DEV3APP.abc.com</appservername>
</environment>
</environments>

**我希望脚本任务从 XML 文件中读取“名称”-与系统变量“机器名称”匹​​配并将输出写入用户变量“ServerNumber”。

如果机器名称是 DEV3WEB - 输出将是数字“1”,DEV3APP 输出将是数字“2”。**

提前致谢。

4

1 回答 1

0

您可以像这样阅读信息:

  • 首先创建一个包含所有 <environment>节点的CTE
  • SELECT在带有普通WHERE子句的简单子句中使用派生表

试试这样:

DECLARE @xml XML='<environments>
  <environment>
    <name>DEV3WEB</name>
    <databaseservername>DEV3DB.apc.com</databaseservername>
    <webservername>DEV3WEB.abc.com/</webservername>
    <appservername>DEV3APP.abc.com</appservername>
  </environment>
  <environment>
    <name>DEV3APP</name>
    <databaseservername>DEV3DB.abc.com</databaseservername>
    <webservername>DEV3WEB.abc.com/</webservername>
    <appservername>DEV3APP.abc.com</appservername>
  </environment>
</environments>';

DECLARE @MachineName NVARCHAR(MAX)=N'DEV3APP';
WITH AllEnvironments AS
(
    select env.value('name[1]','nvarchar(max)') AS Environment_Name
          ,env.value('databaseservername[1]','nvarchar(max)') AS Environment_DatabaseServername
          ,env.value('webservername[1]','nvarchar(max)') AS Environment_WebServername
          ,env.value('appservername[1]','nvarchar(max)') AS Environment_AppServername
    FROM @xml.nodes(N'environments/environment') AS A(env)
)
SELECT *
FROM AllEnvironments
WHERE Environment_Name=@MachineName;

使用更大的 XML 设置过滤器以减少那里的工作量会更快XQuery(查看.nodes()-function):

DECLARE @MachineName NVARCHAR(MAX)=N'DEV3APP';
SELECT   env.value('name[1]','nvarchar(max)') AS Environment_Name
        ,env.value('databaseservername[1]','nvarchar(max)') AS Environment_DatabaseServername
        ,env.value('webservername[1]','nvarchar(max)') AS Environment_WebServername
        ,env.value('appservername[1]','nvarchar(max)') AS Environment_AppServername
FROM @xml.nodes(N'environments/environment[name=sql:variable("@MachineName")]') AS A(env)
于 2016-10-31T09:58:43.780 回答