Sql-Server

生成 XML 的語法不正確

  • April 5, 2016

我正在嘗試在 SQL Server 2000 SP4 中執行以下程式碼,但出現錯誤。

Declare @Body varchar(8000);
Declare @TableHead varchar(8000);
Declare @TableTail varchar(8000);

Set NoCount On;
Set @TableTail = '</table></body></html>';
Set @TableHead = '<html><head>' + 
           '<style>
   td {border: solid black 1px;padding-left:5px;padding-right:5px;padding-top:1px;padding-bottom:1px;font-size:11pt;}
   tr.even {background-color:white;}
   tr.odd {background-color:#eeeeee;}
           </style>' + 
           '</head>' + 
           '<body><table cellpadding=0 cellspacing=0 border=0>' + 
           '<tr bgcolor=#FFEFD8><td align=center><b>Server Name</b></td>' + 
           '<td align=center><b>Product</b></td>' + 
           '<td align=center><b>Provider</b></td>' + 
           '<td align=center><b>Data Source</b></td>' + 
           '<td align=center><b>Is Linked?</b></td></tr>';

Select @Body = (Select 
       name As [TD],
       product As [TD],
       provider As [TD],
       data_source As [TD align=center],
       is_linked As [TD align=center]
   From sys.servers
   Order By is_linked, name
   For XML Raw('tr'), Elements);

Set @Body = Replace(@Body, '_x003D_', '=');
Set @Body = Replace(@Body, '_x0020_', space(1));

Select @TableHead + @Body + @TableTail;

錯誤:

Msg 156, Level 15, State 1
Incorrect syntax near the keyword 'For'.

我從這裡獲取了這段程式碼:

並將其用作建構新報告的參考。我的環境中混合了 SQL Server 2000、2005、2008、2012 實例。此程式碼適用於其他伺服器,但不適用於 2000 SP4。

請幫我解決這個問題。

根據這篇關於在 SQL Server 2000 中使用 FOR XML 的MSDN 文章,“ELEMENTS 指定列作為子元素返回。否則,它們將映射到 XML 屬性。僅在 AUTO 模式下支持此選項。” 因此,SQL Server 2000 不支持將 ELEMENTS 與 RAW 選項一起使用,但它可以與AUTO一起使用。

編輯:

如果您要執行查詢以獲取 SQL Server 2000 中的伺服器列表,您將收到如下消息:

Msg 6825, Level 16, State 1, Line 1
ELEMENTS mode requires FOR XML AUTO.

在您發現 SQL Server 2000 中不存在 sys.servers 之後就會出現這種情況。

這是您需要執行以獲取所需數據的查詢。我更新了列名,因為 SQL Server 2000 不喜歡重複的列名:

SELECT
   srvname AS [TD1]
   ,srvproduct AS [TD2]
   ,providername AS [TD3]
   ,datasource AS [TD4]
   ,isremote AS [TD5]
FROM dbo.sysservers
ORDER BY
   isremote
   ,srvname
FOR XML AUTO, elements

該查詢在 2000 年有效。從那裡,我認為嵌套查詢在 2000 年無法正常工作是一個問題,因為它預計在 2005+ 年會出現。如果我有一些額外的時間,我會多玩一些。

編輯編輯:

正如我所懷疑但無法確認的那樣,FOR XML 在 SQL Server 2000 中的子查詢中不起作用。此頁面有來自 Erland Sommarskog 的文章說明了這一點,他將提出類似問題的人引導到這本書SQL Server 2000 的線上頁面,您可以在其中看到第一個點狀態

FOR XML 在子選擇中無效,無論是在 UPDATE、INSERT 或 DELETE 語句、嵌套的 SELECT 語句還是其他語句(SELECT INTO、賦值)中。

因此,您在 SQL Server 2000 中嘗試執行的操作無法完成。

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