2016-09-16 151 views
1

我正在使用SELECT语句创建xml文件,我无法向文档中添加额外的节点。使用xml路径将节点添加到xml输出

创建当前的结构是这样的:

<DBObjectsToUpdate> 
    <TablesToAdd>...</TablesToAdd> 
    <TableObjectsToDelete> ...</TableObjectsToDelete> 
    <Views> 
     <View> </View> 
    </Views> 
    <StoredProcedures> 
     <StoredProc> </StoredProc> 
    </StoredProcedures> 
</DBObjectsToUpdate> 

我想要做的就是添加围绕“若干意见”和“StoredProcedures”周围的节点。因此,它看起来就像这样:

<DBObjectsToUpdate> 
     <TablesToAdd>...</TablesToAdd> 
     <TableObjectsToDelete> ...</TableObjectsToDelete> 
     <TableObjectsToAdd> 
      <Views> 
       <View> </View> 
      </Views> 
      <StoredProcedures> 
       <StoredProc> </StoredProc> 
      </StoredProcedures> 
     </TableObjectsToAdd> 
    </DBObjectsToUpdate> 

这是select语句的相关部分:

SELECT 
    [Table].TableName AS "@TName", SchemaName AS "@Schema", 
    TextImageFileGroup AS "@TextImageOnFileGroup", 
    ..bunch of stuff that is not important for this question 
FROM 
    (a select statement to get the tables) AS [Table] 

(--Returns all of the Triggers - Currently there are no triggers 
SELECT 
    [Trig].TriggerName AS "@TriggerName", 
    [Trig].TrigDefinition AS "@TrigDefinition" 
FROM 
    (SELECT DISTINCT S7.TableName, S7.TriggerName, TrigDefinition 
    FROM #SourceDBObjects S7 
    JOIN #TableObjectsToAdd T7 ON S7.TableName = T7.TableName 
           AND S7.TriggerName = T7.TriggerName 
           AND T7.TriggerName IS NOT NULL) AS [Trig] 
    WHERE 
     [Table].TableName = [Trig].TableName 
    FOR XML PATH('Trigger'), TYPE) AS [Triggers] 
FROM 
    (SELECT DISTINCT T.TableName, S.SchemaName, S.TextImageFileGroup 
    FROM #TableObjectsToAdd T 
    JOIN #SourceDBObjects S ON T.TableName = S.TableName) AS [Table] 
ORDER BY 
    "@TName" 
FOR XML PATH ('Table'), TYPE) as [TableObjectsToAdd], 
      (--Returns all of the check constrains for table 
        SELECT [CkCon].CheckName AS "@CkName", [CkCon].CkDefinition AS "@CkDefinition", [CkCon].IsCkDisabled AS "@IsCkDisabled" 
        FROM (SELECT DISTINCT T5.TableName, T5.CheckName, CkDefinition, IsCkDisabled 
          FROM #TargetDBObjects T5 JOIN #TableObjectsToDelete D5 ON T5.TableName = D5.TableName AND T5.DefaultName = T5.CheckName AND D5.CheckName IS NOT NULL) AS [CkCon] 
        WHERE [Table].TableName = [CkCon].TableName 
        FOR XML PATH('Check'), 
        TYPE 
       ) AS [CheckConstraints] 
     FROM (
       SELECT DISTINCT D.TableName, T.SchemaName, T.TextImageFileGroup 
       FROM #TableObjectsToDelete D JOIN #TargetDBObjects T ON T.TableName = D.TableName 
      ) AS [Table] 
     ORDER BY "@TName" 
     FOR XML PATH ('Table'), TYPE) 
     as [TableObjectsToDelete], 
     ( ------VIEWS NODE------ 
      SELECT ObjectName AS "@VName", REPLACE(ObjectText, '''', '''''') AS "@VDefinition" 
      FROM #SourceViewsSPFunctionsToAdd 
      WHERE ObjectType = 'View' 
      FOR XML PATH ('View'), TYPE 
     ) AS [Views], 
     ( ------STORED PROCEDURES NODE------ 
      SELECT ObjectName AS "@SPName", REPLACE(ObjectText, '''', '''''') AS "@SPDefinition" 
      FROM #SourceViewsSPFunctionsToAdd 
      WHERE ObjectType = 'StoredProcedure' 
      FOR XML PATH ('StoredProcedure'), TYPE 
     ) AS [StoredProcedures], 
FOR XML PATH(''), 
ROOT('DBObjectsToUpdate') 

如何封装视图和存储过程节点到外部节点用也没有的元素或属性?

回答

1

我想通了这一点...使用SELECT FOR XML PATH(''), TYPE) AS [NameOfNode]

所以有问题的select语句的部分看起来像这样封装的节点: ...

(SELECT 
( ------VIEWS NODE------ 
      SELECT ObjectName AS "@VName", REPLACE(ObjectText, '''', '''''') AS "@VDefinition" 
      FROM #SourceViewsSPFunctionsToAdd 
      WHERE ObjectType = 'View' 
      FOR XML PATH ('View'), TYPE 
     ) AS [Views], 
     ( ------STORED PROCEDURES NODE------ 
      SELECT ObjectName AS "@SPName", REPLACE(ObjectText, '''', '''''') AS "@SPDefinition" 
      FROM #SourceViewsSPFunctionsToAdd 
      WHERE ObjectType = 'StoredProcedure' 
      FOR XML PATH ('StoredProcedure'), TYPE 
     ) AS [StoredProcedures], 
FOR XML PATH (''), TYPE) as [DBObjectsToAdd] 
+0

马丽娟!我希望你得到[自学者徽章](http://stackoverflow.com/help/badges/14/self-learner)。我会开始:+1 :-) – Shnugo