AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 107238
Accepted
Racer SQL
Racer SQL
Asked: 2015-07-17 10:16:34 +0800 CST2015-07-17 10:16:34 +0800 CST 2015-07-17 10:16:34 +0800 CST

FOR XML não pôde serializar os dados porque contém o caractere (0x0000)

  • 772

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 XMLestá 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...
sql-server sql-server-2008-r2
  • 4 4 respostas
  • 35311 Views

4 respostas

  • Voted
  1. Best Answer
    Rob Farley
    2015-07-17T10:47:11+08:002015-07-17T10:47:11+08:00

    A linha:

    ...
    SELECT 
        [CodFuncionario],
        STUFF
        (
            (
                SELECT 
                    ' / ' + 
                    CAST
                    (
                        [DescFuncao] + '-' + 
                        [DescTempoExperiencia] 
                        AS VARCHAR(MAX)
                    )...
    

    Deveria estar:

    ...
    SELECT 
        [CodFuncionario],
        STUFF
        (
            (
                SELECT 
                    ' / ' + 
                    CAST
                    (
                        replace -- *** NEW! ***
                        (
                            [DescFuncao] + '-' + 
                            [DescTempoExperiencia],
                            char(0),
                            ''
                        ) 
                        AS VARCHAR(MAX)
                    )...
    
    • 13
  2. Aaron Bertrand
    2015-07-17T10:47:21+08:002015-07-17T10:47:21+08:00

    Eu recebo o mesmo erro quando faço isso:

    DECLARE @foo VARCHAR(32) = CHAR(0); -- 0x0000
    SELECT @foo FOR XML PATH, TYPE;
    

    Então, encontre todas as instâncias de DescFuncaoor DescTempoExperiencia(desculpe, você não usa alias de tabela, então é impossível dizer de qual tabela elas vêm) onde o conteúdo contém CHAR(0)e corrija-as. Por exemplo:

    UPDATE dbo.whatever 
      SET DescFuncao = REPLACE(DescFuncao, CHAR(0), '')
      WHERE DescFuncao LIKE '%' + CHAR(0) + '%';
    

    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:

    STUFF(( SELECT ' / ' + CAST(REPLACE([DescFuncao] + '-' 
      + [DescTempoExperiencia], CHAR(0), '') AS VARCHAR(MAX))
    

    É 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-> 0x0008també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.

    • 12
  3. jumxozizi
    2016-09-02T07:44:21+08:002016-09-02T07:44:21+08:00

    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 , TYPEda sua instrução XML.

    Outra maneira é remover esses caracteres na instrução select:

    REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( 
    REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( 
    REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( 
    REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( 
    REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( 
    REPLACE( REPLACE( REPLACE( REPLACE( 
        < YOUR EXPRESSION TO BE CLEANED >
    ,char(0x0000),'') ,char(0x0001),'') ,char(0x0002),'') ,char(0x0003),'') ,char(0x0004),'') 
    ,char(0x0005),'') ,char(0x0006),'') ,char(0x0007),'') ,char(0x0008),'') ,char(0x000B),'') 
    ,char(0x000C),'') ,char(0x000E),'') ,char(0x000F),'') ,char(0x0010),'') ,char(0x0011),'') 
    ,char(0x0012),'') ,char(0x0013),'') ,char(0x0014),'') ,char(0x0015),'') ,char(0x0016),'') 
    ,char(0x0017),'') ,char(0x0018),'') ,char(0x0019),'') ,char(0x001A),'') ,char(0x001B),'') 
    ,char(0x001C),'') ,char(0x001D),'') ,char(0x001E),'') ,char(0x001F),'')
    

    Você também pode criar uma função com essas instruções de substituição.

    • 11
  4. crokusek
    2019-07-02T10:11:46+08:002019-07-02T10:11:46+08:00

    Otimizando a resposta de @jumxozizi usando translate() (SQL Server 2017++). O código abaixo substituirá esses caracteres por pontos.

    declare
        @illegalChars nvarchar(4000) = 
            char(0) + char(1) + char(2) + char(3) + char(4) + char(5) + char(6) + char(7) + char(8) + char(11) + 
            char(12) + char(14) + char(15) + char(16) + char(17) + char(18) + char(19) + char(20) + char(21) + char(22) + 
            char(23) + char(24) + char(25) + char(26) + char(27) + char(28) + char(29) + char(30) + char(31);
    
    select translate(input, @illegalChars, replicate('.', len(@illegalChars))) as Result
    

    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

    • 4

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve