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。
请帮我解决这个问题。
根据这篇关于在 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 中执行的操作无法完成。