У меня большой запрос (при необходимости я опубликую его здесь), и я получаю эту ошибку:
Сообщение 6841, уровень 16, состояние 1, строка 1
FOR XML не удалось сериализовать данные для узла «NoName», поскольку он содержит символ (0x0000), который не разрешен в XML. Чтобы получить эти данные с помощью FOR XML, преобразуйте их в двоичный, varbinary или тип данных изображения и используйте директиву BINARY BASE64.
Единственная часть, которую я использую, FOR XML
находится здесь:
WHERE
(CodFuncionario = Results.CodFuncionario)
FOR XML PATH(''), TYPE).value('(./text())[1]',
'VARCHAR(MAX)'), 1, 2, '') AS [Experiencia]
Но что это node noname
? и как я могу посмотреть на это значение:(0x0000)
Это один из подзапросов (единственная часть, у меня есть FOR 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...
источник
Я проверил это с ASCII - символами 0-255 и выяснил , что вы получите эту ошибку для символов:
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
.Одним из обходных путей является удаление
, TYPE
из вашего оператора XML.Другой способ - удалить эти символы в операторе select:
Вы также можете создать функцию с этими операторами замены.
источник
Оптимизация ответа от @jumxozizi с помощью translate () (SQL Server 2017 ++). Код ниже заменит эти символы точками.
Чтобы удалить их вместо этого, можно сначала перевести () их в char (0), а затем обернуть это с помощью replace ().
Из идеи: /programming//a/55906638/538763
источник