J'ai une grosse requête (si nécessaire je la posterai ici) et j'obtiens cette erreur:
Msg 6841, niveau 16, état 1, ligne 1
pour XML n'a pas pu sérialiser les données pour le nœud «NoName» car il contient un caractère (0x0000) qui n'est pas autorisé dans XML. Pour récupérer ces données à l'aide de FOR XML, convertissez-les en type de données binaire, varbinaire ou image et utilisez la directive BINARY BASE64.
La seule partie que j'utilise FOR XML
est ici:
WHERE
(CodFuncionario = Results.CodFuncionario)
FOR XML PATH(''), TYPE).value('(./text())[1]',
'VARCHAR(MAX)'), 1, 2, '') AS [Experiencia]
Mais qu'est-ce que c'est node noname
? et comment puis-je rechercher cette valeur:(0x0000)
C'est l'une des sous-requêtes (la seule partie que j'ai pour 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...
la source
Je l' ai testé cela avec des caractères ASCII 0-255 et a trouvé que vous obtenez cette erreur pour les caractères:
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
.Une solution de contournement consiste à supprimer
, TYPE
de votre instruction XML.Une autre façon consiste à supprimer ces caractères dans l'instruction select:
Vous pouvez également créer une fonction avec ces instructions replace.
la source
Optimisation de la réponse de @jumxozizi à l'aide de translate () (SQL Server 2017 ++). Le code ci-dessous remplacera ces caractères par des points.
Pour les supprimer à la place, on pourrait d'abord les traduire () en char (0) puis les envelopper avec un replace ().
De l'idée: /programming//a/55906638/538763
la source