Sql-Server

如何在 FOR XML 查詢中定位由 XMLTEXT 生成的元素?

  • February 13, 2019

我正在嘗試用來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');

引用自:https://dba.stackexchange.com/questions/229590