生成 XML 的語法不正確
我正在嘗試在 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 中嘗試執行的操作無法完成。