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 / 319262
Accepted
Erik Darling
Erik Darling
Asked: 2022-11-07 11:23:21 +0800 CST2022-11-07 11:23:21 +0800 CST 2022-11-07 11:23:21 +0800 CST

Retornar o número variável de atributos do XML como valores separados por vírgula

  • 772

estendido demais

No SQL Server Extended Events para o relatório de processo bloqueado e XML de deadlock, é possível obter vários valores de SQL Handle de volta para identificar as consultas envolvidas no evento gerado.

Uma vez que 1 ou mais SQL Handles podem estar envolvidos, consultar o XML de forma confiável para recuperá-los pode ser difícil, e também torna a XQuery mais direta incorreta, pois ela apenas recupera o primeiro valor armazenado.

sqlhandle = bd.value('(process/executionStack/frame/@sqlhandle)[1]', 'varchar(130)'),

Um exemplo de fragmento XML para ilustração se parece com isto:

<executionStack>
      <frame line="1" stmtend="108" sqlhandle="0x020000008d18260040e407ba48fc247b0cb6121c21c2cf2b0000000000000000000000000000000000000000" />
      <frame line="1" stmtend="108" sqlhandle="0x02000000dd847b18dcaa4a09a89f56595186fcf91da8a7f70000000000000000000000000000000000000000" />
</executionStack>

Um exemplo mais completo está disponível neste SQL Fiddle .

cheguei até aqui:

SELECT 
    sql_handle = 
        @x.query('for $s in //executionStack/frame return $s');  

Mas isso não é o que eu procuro. Estender essa consulta para usar o @sqlhandleatributo gera um erro:

SELECT 
    sql_handle = 
        @x.query('for $s in //executionStack/frame/@sqlhandle return $s');  

Msg 2396, Level 16, State 1, Line 60 XQuery [query()]: o atributo não pode aparecer fora de um elemento

Como posso consultar XML como este para retornar todos os identificadores SQL listados como uma lista separada por vírgulas?

sql-server
  • 4 4 respostas
  • 368 Views

4 respostas

  • Voted
  1. Best Answer
    David Browne - Microsoft
    2022-11-07T11:58:36+08:002022-11-07T11:58:36+08:00

    Tente algo assim :

    SELECT x.d.value('@name','varchar(200)') name, f.sqlhandles
    FROM @x.nodes('//data') x(d)
    CROSS APPLY 
    (
      SELECT string_agg(n.f.value('@sqlhandle','varchar(200)'),',') sqlhandles
      from x.d.nodes('.//executionStack/frame') n(f)
     ) f
    
    • 7
  2. Martin Smith
    2022-11-07T15:25:27+08:002022-11-07T15:25:27+08:00

    Para superar a mensagem de erro "O atributo pode não aparecer fora de um elemento", você pode usar a stringfunção.

     SELECT @x.query('
                    for $s in  //process/executionStack/frame/@sqlhandle
                    return string($s)  
                    ').value('.', 'varchar(max)')
    

    O acima retorna uma lista delimitada por espaço, mas como os próprios identificadores SQL não podem conter espaços, neste caso, você pode apenas usar a REPLACEpara obter o resultado final delimitado por vírgula desejado.

    Ou faça

     SELECT @x.query('
                    for $s in  //process/executionStack/frame/@sqlhandle
                    return concat(",",string($s))
                    ').value('substring(./text()[1], 2)', 'varchar(max)')
    

    Alternativamente, você pode usar

    SELECT REPLACE(
        @x.query('data(//process/executionStack/frame/@sqlhandle)').value('.', 'varchar(max)'), 
        ' ',
        ',')
    

    Ou outra alternativa, sem concat, fornecida por Paul White nos comentários

    SELECT 
        sql_handles = 
        @x.query
        (
            '
            for $h in (//executionStack/frame/@sqlhandle)
            return 
            (
                ",", 
                string($h)
            )
            '
        ).value
        (
            'substring(./text()[1], 3)', 
            'nvarchar(max)'
        );
    
    • 5
  3. Paul White
    2022-11-08T19:16:35+08:002022-11-08T19:16:35+08:00

    O código que Erik acabou usando sp_HumanEvents foi :

    CROSS APPLY 
    (
        SELECT 
            sql_handles = 
                STUFF
                (
                    (
                        SELECT DISTINCT
                            ',' +
                            RTRIM
                            (
                                n.c.value('@sqlhandle', 'varchar(130)')
                            )
                        FROM kheb.blocked_process_report.nodes('//executionStack/frame') AS n(c)
                        FOR XML
                            PATH(''),
                            TYPE
                    ).value('./text()[1]', 'varchar(max)'),
                    1,
                    1,
                    ''
                )                    
    ) AS c;
    
    • 2
  4. Charlieface
    2022-11-08T07:20:15+08:002022-11-08T07:20:15+08:00

    Essencialmente, seu problema é que você está retornando o atributo real como um nó de nível superior, o que você não pode fazer. Em vez disso, você precisa atomizá-lo em uma string. Você pode fazer isso explicitamente, mas de qualquer maneira precisa concatde , que fará isso por você.

    Então você pode usar a seguinte sintaxe XQuery
    for $x in your/Xquery/path return concat($x/@attributeName, ",")

    Além disso, você deve sempre tentar usar o /eixo filho, em vez do //eixo descendente, pois é mais rápido.

    SELECT 
      sql_handle =  @x.query('
        for $x in /event/data/value/blocked-process-report/blocked-process/process/executionStack/frame
        return concat($x/@sqlhandle, ",")
        ');  
    

    db<>violino

    • 0

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