簡體   English   中英

如何將多個 SQL“SELECT AS XML PATH”查詢結果連接到一個 XML 文件中

[英]How to concatenate multiple SQL "SELECT AS XML PATH " query results INTO one XML file

我在一個 MS SQL 程序中有多個 SELECT... AS XML PATH 查詢,但我需要程序的結果在一個 xml 文件中。

例如,如何在一個 SQL 程序中將多個 select... as xml 的結果 xml 連接成一個結果 xml 文件? 問題是,這些查詢中的每一個都是使用 CURSOR 創建的,所以我不能使用 UNION ALL。

這個 cursor 從 INFORMATION_SCHEMA.TABLES 中獲取表名,每個 select 來自不同的表。 不要復雜化,但每個 select 都是動態創建的,因為它首先創建為 VARCHAR,然后使用 exec(@sql) 執行,所以

fetch c_table_name from cursor_c
@sql=     ' select
           id as ''value/@id'',
           name as ''value''
           from _TABLENAME_
           where somevalue=cursorValue
           for xml path('''')'


set @sql = replace(sql, '_TABLENAME_, c_table_name
exec(@sql)

每個這樣的 select xml 結果例如:

   <value id=1>aaaa</value>
   <value id=2>bbb</value>

cursor 中的下一個表可能會給出另一個結果,例如:

   <value id=11>ccc</value>
   <value id=21>ddd</value>

但結果將是單獨的 xml 個文件,我只想要一個這樣的文件:

<value id=1>aaaa</value>
<value id=2>bbb</value>
<value id=11>ccc</value>
<value id=21>ddd</value>
....

那可能嗎? 我嘗試將結果放入 xml 變量,然后將另一個結果添加到同一個變量,這不起作用。 我沒有嘗試過。 問題是每個 select 都依賴於 cursor。它必須是這樣的,選擇不是這么簡單這只是例子。 甚至有可能有多個 SELECT... FOR XML PATH 語句,並通過將它們全部連接起來以某種方式管理它們以生成一個 XML 結果嗎?

您可以使用STRING_AGG()構建一個 SQL 語句來創建您的聯合,然后執行它,而不是使用 cursor 並一條一條地執行您的語句:

DECLARE @sql NVARCHAR(MAX) = '';
SELECT  @sql = STRING_AGG(CONCAT('SELECT id AS [value/@id], name AS [value] FROM ', 
                            QUOTENAME(TABLE_SCHEMA), '.', QUOTENAME(TABLE_NAME), 
                            ' FOR XML PATH('''')'), ' UNION ALL ')
FROM    INFORMATION_SCHEMA.TABLES 
WHERE   ....

PRINT @sql;
--EXECUTE sp_executesql @sql  -- Check first with print, then uncomment to execute

話雖如此,如果您有如此多的表,這些表之間的關系密切到足以聯合在一起,但數量又多到需要動態 SQL 來引用它們,那么這對我來說有點代碼味。 如果所有的表確實相關並且合並有意義,那么也許視圖是有序的,或者它們實際上應該是一個表?


附錄

如果您使用的是 2017 年之前的 SQL 服務器版本,那么您可以使用舊的 XML hack 將您的行連接成一個字符串:

DECLARE @sql NVARCHAR(MAX) = '';
SET @sql = STUFF((SELECT CONCAT(' UNION ALL SELECT id AS [value/@id], name AS [value] FROM ', 
                            QUOTENAME(TABLE_SCHEMA), '.', QUOTENAME(TABLE_NAME), 
                            ' FOR XML PATH('''')')
                FROM    INFORMATION_SCHEMA.TABLES 
                WHERE   .....
                FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 10, '')

也許您可以在 cursor 之前創建一個臨時表,在 cursor 內部將每個 select 插入到該表中,並在 cursor 關閉后從該表中執行一個 select 然后刪除它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM