共用方式為


用戶端與伺服器端 XML 格式設定 (SQLXML 4.0)

適用於:SQL ServerAzure SQL 資料庫 Azure SQL 受控執行個體

本主題描述 SQLXML 中用戶端與伺服器端 XML 格式之間的一般差異。

用戶端格式設定不支援多個數據列集查詢

當您使用用戶端 XML 格式設定時,不支援產生多個數據列集的查詢。 例如,假設您有指定用戶端格式設定的虛擬目錄。 請考慮此範例範本,其 sql:query> 區塊中有兩個 <SELECT 語句:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query>  
     SELECT FirstName FROM Person.Contact FOR XML Nested;   
     SELECT LastName FROM Person.Contact FOR XML Nested    
  </sql:query>  
</ROOT>  

您可以在應用程式程式代碼中執行此範本,並傳回錯誤,因為用戶端 XML 格式不支援多個資料列集的格式。 如果您在兩個不同的 <sql:query> 區塊中指定查詢,您將取得所需的結果。

timestamp 在用戶端與伺服器端格式設定中以不同方式對應

在伺服器端 XML 格式中,時間戳類型的資料庫數據行會對應至 i8 XDR 類型(在查詢中指定 XMLDATA 選項時)。

在用戶端 XML 格式中,時間戳類型的資料庫數據行會對應至 uribin.base64 XDR 類型(視查詢中是否指定二進位 base64 選項而定)。 如果您使用 updategram 和大量載入功能,bin.base64 XDR 類型會很有用,因為此類型會轉換成 SQL Server 時間戳類型。 如此一來,插入、更新或刪除作業就會成功。

深層 VARIANT 用於伺服器端格式設定

在伺服器端 XML 格式中,會使用 VARIANT 類型的深層類型。 如果您使用用戶端 XML 格式設定,則變體會轉換成 Unicode 字串,而且不會使用 VARIANT 的子類型。

NESTED 模式與 AUTO 模式

用戶端 FOR XML 的 NESTED 模式類似於伺服器端 FOR XML 的 AUTO 模式,但有下列例外狀況:

當您在伺服器端使用 AUTO 模式查詢檢視時,檢視名稱會以產生的 XML 中的項目名稱傳回。

例如,假設在 AdventureWorksdatabase 的 Person.Contact 數據表上建立下列檢視:

CREATE VIEW ContactView AS (SELECT ContactID as CID,  
                               FirstName  as FName,  
                               LastName  as LName  
                        FROM Person.Contact)  

下列範本會針對 ContactView 檢視指定查詢,同時指定伺服器端 XML 格式設定:

 <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="0">  
    SELECT *  
    FROM   ContactView  
    FOR XML AUTO  
  </sql:query>  
</ROOT>  

當您執行範本時,會傳回下列 XML。 (僅顯示部分結果。請注意,專案名稱是執行查詢的檢視名稱。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <ContactView CID="1" FName="Gustavo" LName="Achong" />   
  <ContactView CID="2" FName="Catherine" LName="Abel" />   
...  
</ROOT>  

當您使用對應的 NESTED 模式指定用戶端 XML 格式設定時,基表名稱會在產生的 XML 中當做專案名稱傳回。 例如,下列修訂后的範本會執行相同的 SELECT 語句,但 XML 格式設定是在用戶端上執行(也就是 ,在範本中將 client-side-xml 設定為 true):

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="1">  
    SELECT *  
    FROM   ContactView  
    FOR XML NESTED  
  </sql:query>  
</ROOT>  

執行此範本會產生下列 XML。 請注意,在此案例中,專案名稱是基表名稱。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Person.Contact CID="1" FName="Gustavo" LName="Achong" />   
  <Person.Contact CID="2" FName="Catherine" LName="Abel" />   
...  
</ROOT>  

當您使用伺服器端 FOR XML 的 AUTO 模式時,查詢中指定的數據表別名會以產生的 XML 中的專案名稱傳回。

例如,請考慮此範本:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="0">  
    SELECT FirstName as fname,  
           LastName as lname  
    FROM   Person.Contact C  
    FOR XML AUTO  
  </sql:query>  
</ROOT>  

執行樣本會產生下列 XML:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <C fname="Gustavo" lname="Achong" />   
  <C fname="Catherine" lname="Abel" />   
...  
</ROOT>   

當您使用用戶端 FOR XML 的 NESTED 模式時,數據表名稱會以產生的 XML 中的專案名稱傳回。 (不使用查詢中指定的數據表別名。例如,請考慮此範本:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="1">  
    SELECT FirstName as fname,  
           LastName as lname  
    FROM   Person.Contact C  
    FOR XML NESTED  
  </sql:query>  
</ROOT>  

執行樣本會產生下列 XML:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Person.Contact fname="Gustavo" lname="Achong" />   
  <Person.Contact fname="Catherine" lname="Abel" />   
...  
</ROOT>  

如果您有以 dbobject 查詢傳回數據行的查詢,則無法使用這些數據行的別名。

例如,請考慮下列範本,其會執行會傳回員工標識碼和相片的查詢。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
<sql:query client-side-xml="1">  
   SELECT ProductPhotoID, LargePhoto as P  
   FROM   Production.ProductPhoto  
   WHERE  ProductPhotoID=5  
   FOR XML NESTED, elements  
</sql:query>  
</ROOT>  

執行此範本會將 Photo 資料行當做 dbobject 查詢傳回。 在此 dbobject 查詢中, @P 參考不存在的數據行名稱。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Production.ProductPhoto>  
    <ProductPhotoID>5</ProductPhotoID>  
    <LargePhoto>dbobject/Production.ProductPhoto[@ProductPhotoID='5']/@P</LargePhoto>  
  </Production.ProductPhoto>  
</ROOT>  

如果在伺服器上完成 XML 格式設定(client-side-xml=“0”),您可以使用傳回實際數據表和數據行名稱之 dbobject 查詢的數據行別名(即使您已指定別名也一樣)。 例如,下列範本會執行查詢,並在伺服器上完成 XML 格式設定( 未指定用戶端 XML 選項, 而且未選取虛擬根目錄的 [執行 On Client ] 選項)。 查詢也會指定 AUTO 模式(而非用戶端 NESTED 模式)。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
<sql:query   
   SELECT ProductPhotoID, LargePhoto as P  
   FROM   Production.ProductPhoto  
   WHERE  ProductPhotoID=5  
   FOR XML AUTO, elements  
</sql:query>  
</ROOT>  

執行此範本時,會傳回下列 XML 檔(請注意,在 LargePhoto 數據行的 dbobject 查詢中不會使用別名):

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Production.ProductPhoto>  
    <ProductPhotoID>5</ProductPhotoID>  
    <LargePhoto>dbobject/Production.ProductPhoto[@ProductPhotoID='5']/@LargePhoto</LargePhoto>  
  </Production.ProductPhoto>  
</ROOT>  

用戶端與伺服器端 XPath

除了這些差異之外,用戶端 XPath 和伺服器端 XPath 的運作相同:

  • 當您使用用戶端 XPath 查詢時所套用的數據轉換,與使用伺服器端 XPath 查詢時所套用的數據轉換不同。 用戶端 XPath 會使用 CAST,而不是 CONVERT 模式 126。

  • 當您在範本中指定 client-side-xml=“0” (false)時,您要求伺服器端 XML 格式設定。 因此,您無法指定 FOR XML NESTED,因為伺服器無法辨識 NESTED 選項。 這樣會產生錯誤。 您必須使用伺服器可辨識的 AUTO、RAW 或 EXPLICIT 模式。

  • 當您在範本中指定 client-side-xml=“1” (true)時,您要求用戶端 XML 格式設定。 在此情況下,您可以指定 FOR XML NESTED。 如果您指定 FOR XML AUTO,則 XML 格式會在伺服器端發生,但 用戶端 xml=“1” 是在範本中指定。

另請參閱

FOR XML 安全性考慮 (SQLXML 4.0)
用戶端 XML 格式設定 (SQLXML 4.0)
伺服器端 XML 格式設定 (SQLXML 4.0)