Estou com uma grande consulta (se necessário postarei aqui) e estou recebendo este erro:
Msg 6841, Level 16, State 1, Line 1
FOR XML não pôde serializar os dados para o nó 'NoName' porque contém um caractere (0x0000) que não é permitido em XML. Para recuperar esses dados usando FOR XML, converta-os para o tipo de dados binary, varbinary ou image e use a diretiva BINARY BASE64.
A única parte que eu uso FOR XML
está aqui:
WHERE
(CodFuncionario = Results.CodFuncionario)
FOR XML PATH(''), TYPE).value('(./text())[1]',
'VARCHAR(MAX)'), 1, 2, '') AS [Experiencia]
Mas, o que é node noname
? e como posso procurar esse valor:(0x0000)
Esta é uma das subconsultas (a única parte que tenho para XML):
SELECT
[CodFuncionario],
STUFF
(
(
SELECT
' / ' +
CAST
(
[DescFuncao] + '-' +
[DescTempoExperiencia]
AS VARCHAR(MAX)
)...
FROM
[Linked_Server].db.dbo.tblFuncionarioExperiencia T0
INNER JOIN
[Linked_Server].db.dbo.tblFuncao T1 On T0.codFuncao = T1.CodFuncao
INNER JOIN
[Linked_Server].db.dbo.tblTempoExperiencia T2 ON T0.CodTempoExperiencia = T2.CodTempoExperiencia
WHERE
(CodFuncionario = Results.CodFuncionario)
FOR XML PATH(''), TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '') AS [Experiencia]
FROM
[Linked_Server].db.dbo.tblFuncionarioExperiencia Results
GROUP BY
CodFuncionario) as T2
On T0.CodFuncionario = T2.CodFuncionario
Left Join...
A linha:
Deveria estar:
Eu recebo o mesmo erro quando faço isso:
Então, encontre todas as instâncias de
DescFuncao
orDescTempoExperiencia
(desculpe, você não usa alias de tabela, então é impossível dizer de qual tabela elas vêm) onde o conteúdo contémCHAR(0)
e corrija-as. Por exemplo:Não é suficiente filtrar essas linhas em sua consulta, porque você não sabe em que ponto os métodos XML irão funcionar, mas você também pode tentar:
É claro que corrigir os dados de origem uma vez será muito mais eficiente do que executar essas rotinas de substituição todas as vezes .
Observe que esse pode não ser o único caractere específico que causa esse problema.
0x0001
->0x0008
também irá gerar o mesmo erro. Então, se você tem esses personagens lá também, você deve investigar de onde eles estão vindo e corrigir a fonte.Eu testei isso com caracteres ASCII 0-255 e descobri que você recebe este erro para caracteres:
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x000B, 0x000C, 0x000E, 0x000F, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F
.Uma solução alternativa é remover
, TYPE
da sua instrução XML.Outra maneira é remover esses caracteres na instrução select:
Você também pode criar uma função com essas instruções de substituição.
Otimizando a resposta de @jumxozizi usando translate() (SQL Server 2017++). O código abaixo substituirá esses caracteres por pontos.
Para eliminá-los, pode-se traduzi-los primeiro para char(0) e depois envolvê-los com um replace().
Da ideia: https://stackoverflow.com/a/55906638/538763