我试图在 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 中的服务器列表,您会收到如下消息:
在您发现 SQL Server 2000 中不存在 sys.servers 之后,就会发生这种情况。
这是您需要运行以获取所需数据的查询。我更新了列名,因为 SQL Server 2000 不喜欢重复的列名:
该查询在 2000 年有效。从那里开始,我认为嵌套查询在 2000 年无法正常工作是一个问题,因为它预计在 2005 年以后会有效。如果我有一些额外的时间,我会多玩一些。
编辑编辑:
正如我所怀疑但无法确认的那样,FOR XML 在 SQL Server 2000 的子查询中不起作用。此页面上有一篇来自 Erland Sommarskog 的帖子说明了这一点,他指导提出类似问题的人阅读这本书SQL Server 2000 的联机页面,您可以在其中查看第一个点状态
因此,您在 SQL Server 2000 中尝试做的事情无法完成。
您需要将语法更改为:
For XML Auto, Elements);
因为 Row 标记名称仅允许使用 FOR XML 的 RAW 或 PATH 模式。