生成 XML 的语法不正确

SQL*_*DBA 3 xml sql-server sql-server-2000 t-sql

我试图在 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;
Run Code Online (Sandbox Code Playgroud)

错误:

Msg 156, Level 15, State 1
Incorrect syntax near the keyword 'For'.
Run Code Online (Sandbox Code Playgroud)

我从这里拿了这个代码:

并将其用作构建新报告的参考。我的环境中混合了 SQL Server 2000、2005、2008、2012 实例。此代码适用于其他服务器,但不适用于 2000 SP4。

请帮我解决这个问题。

Ste*_*ken 7

根据这篇关于在 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.
Run Code Online (Sandbox Code Playgroud)

这将在您发现 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
Run Code Online (Sandbox Code Playgroud)

该查询在 2000 年有效。从那里开始,我认为嵌套查询在 2000 年无法正常工作是一个问题,因为它预计在 2005 年以上。如果我有一些额外的时间,我会多玩一些。

编辑编辑:

正如我所怀疑但无法确认的那样,FOR XML 在 SQL Server 2000 中的子查询中不起作用。此页面上有来自 Erland Sommarskog 的帖子说明了同样多的内容,他将提出类似问题的人引导至这本书SQL Server 2000 的在线页面,您可以在其中看到第一个点状态

FOR XML 在子选择中无效,无论是在 UPDATE、INSERT 或 DELETE 语句、嵌套的 SELECT 语句还是其他语句(SELECT INTO、赋值)中。

因此,您尝试在 SQL Server 2000 中执行的操作无法完成。