Estou tentando executar o código abaixo no SQL Server 2000 SP4, mas recebo um erro.
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;
Erro:
Msg 156, Level 15, State 1
Incorrect syntax near the keyword 'For'.
Peguei esse código daqui:
e estou usando-o como referência para criar um novo relatório. Eu tenho uma mistura de instâncias do SQL Server 2000, 2005, 2008, 2012 em meu ambiente. Este código funciona em outros servidores, mas não no 2000 SP4.
Por favor me ajude a corrigir isso.
De acordo com este artigo do MSDN para usar FOR XML no SQL Server 2000, "ELEMENTS Especifica que as colunas são retornadas como subelementos. Caso contrário, elas são mapeadas para atributos XML. Esta opção é suportada apenas no modo AUTO ". Portanto, seu uso de ELEMENTS com a opção RAW não é suportado no SQL Server 2000, mas funciona com AUTO .
Editar:
Se você executasse a consulta para obter a lista de servidores no SQL Server 2000, receberia uma mensagem como esta:
Isso aconteceria depois que você descobrisse que sys.servers não existe no SQL Server 2000.
Esta é a consulta que você precisa executar para obter os dados desejados. Atualizei os nomes das colunas porque o SQL Server 2000 não gosta de nomes de colunas duplicados:
Essa consulta funciona em 2000. A partir daí, acho que é um problema com a consulta aninhada não funcionar em 2000, como esperado em 2005+. Se eu tiver algum tempo extra, vou brincar um pouco mais.
Editar edição:
Como eu suspeitava, mas não pude confirmar, FOR XML não funciona em uma subconsulta no SQL Server 2000. Esta página tem uma postagem de Erland Sommarskog afirmando isso e ele direciona a pessoa que fez uma pergunta semelhante a este Livros Página online para SQL Server 2000 onde você pode ver os primeiros estados de ponto
Portanto, o que você está tentando fazer no SQL Server 2000 não pode ser feito.
Você precisará alterar a sintaxe para:
For XML Auto, Elements);
porque o nome da tag Row só é permitido com o modo RAW ou PATH de FOR XML.