2016-09-16 63 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