Sql-Server
如何在 FOR XML 查詢中定位由 XMLTEXT 生成的元素?
我正在嘗試用來
FOR XML
模擬 OData 提要。我的要求之一是在某個地方我需要一個對於所有記錄都是恆定的 XML 元素;我打算為此使用XMLTEXT 指令。我的 XML 需要看起來像這樣;對於數據庫中的每條記錄,
<entry> <id>1</id> <test type="dummy" /> <!-- some more nested elements --> </entry>
當我使用以下查詢時,
<test>
元素出現在元素之前,<id>
即使聲明出現在它之後:CREATE TABLE #temp (id int); INSERT INTO #temp VALUES (1), (2); SELECT 1 AS Tag, NULL AS Parent, id AS [entry!1!id!ELEMENT], '<test type="dummy" />' AS [entry!1!test!XMLTEXT] -- other columns FROM #temp FOR XML EXPLICIT; DROP TABLE #temp;
這給出了以下結果(小提琴):
<entry> <test type="dummy"/> <id>1</id> </entry>
我在這裡做錯了什麼,還是這是 XMLTEXT 的限制?一種解決方法可能是將其視為正常嵌套元素,但即使我在元素中的更下方有更多嵌套元素,它也會起作用
<entry>
嗎?
經過一番折騰,我發現有一個 XML 指令可以完成這項工作(如果我省略了屬性名稱,
test
):SELECT 1 AS Tag, NULL AS Parent, id AS [entry!1!id!ELEMENT], '<test type="dummy" />' AS [entry!1!!XML] FROM #temp FOR XML EXPLICIT;
這會產生我想要的結果:
<entry><id>1</id><test type="dummy" /></entry>
(展示)
此處簡要提到了該指令,但我找不到更多文件或任何範例。
如果您出於某種原因不需要,則
for xml explicit
可以改用for xml path
我認為更容易處理的方法。您可以將字元串文字轉換為 XML
select T.id, cast('<test type="dummy" />' as xml) from #temp as T for xml path('entry');
或者您可以將其設置為一個值
select T.id, 'dummy' as [test/@type] from #temp as T for xml path('entry');