Разбор XML с использованием xQuery SQL - PullRequest
0 голосов
/ 24 октября 2018

У меня есть следующий Deadlock XML, в котором я выполняю некоторый анализ:

    DECLARE @myXML XML  
SET @myXML = '<deadlock>
 <victim-list>
  <victimProcess id="process2ccd468" />
 </victim-list>
 <process-list>
  <process id="process2ccd468" taskpriority="0" logused="0" waitresource="KEY: 15:72059730480660480 (8b05ac458a46)" waittime="291" ownerId="51153050681" transactionname="implicit_transaction" lasttranstarted="2018-08-14T10:53:42.770" XDES="0xc9aa855930" lockMode="U" schedulerid="4" kpid="7392" status="suspended" spid="116" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2018-08-14T10:53:42.850" lastbatchcompleted="2018-08-14T10:53:42.847" lastattention="1900-01-01T00:00:00.847" clientapp="Microsoft JDBC Driver for SQL Server" hostname="zzz" hostpid="0" loginname="zzz" isolationlevel="read committed (2)" xactid="51153050681" currentdb="16" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
   <executionStack>
    <frame procname="adhoc" line="1" stmtstart="112" stmtend="318" sqlhandle="0x020000007e173f0d7450e209757f52677b92eb10d602872d0000000000000000000000000000000000000000">
unknown    </frame>
    <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
   </executionStack>
   <inputbuf>
(@P0 varchar(8000),@P1 bit,@P2 varchar(8000),@P3 bigint)Update WLWklstItem set BalAmt = @P0, InclInAggregBalInd = @P1 where WklstObjExtId = @P2 and RsnKey = @P3                                   </inputbuf>
  </process>
  <process id="process2c25088" taskpriority="0" logused="0" waitresource="KEY: 15:72058563269558272 (b23109e7b96b)" waittime="299" ownerId="51153050625" transactionname="implicit_transaction" lasttranstarted="2018-08-14T10:53:42.760" XDES="0x82ba4c98e0" lockMode="U" schedulerid="3" kpid="34124" status="suspended" spid="300" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2018-08-14T10:53:42.837" lastbatchcompleted="2018-08-14T10:53:42.833" lastattention="1900-01-01T00:00:00.833" clientapp="Microsoft JDBC Driver for SQL Server" hostname="zzz" hostpid="0" loginname="zzz" isolationlevel="read committed (2)" xactid="51153050625" currentdb="16" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
   <executionStack>
    <frame procname="adhoc" line="1" stmtstart="112" stmtend="318" sqlhandle="0x020000007e173f0d7450e209757f52677b92eb10d602872d0000000000000000000000000000000000000000">
unknown    </frame>
    <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
   </executionStack>
   <inputbuf>
(@P0 varchar(8000),@P1 bit,@P2 varchar(8000),@P3 bigint)Update WLWklstItem set BalAmt = @P0, InclInAggregBalInd = @P1 where WklstObjExtId = @P2 and RsnKey = @P3                                   </inputbuf>
  </process>
  <process id="process15be37fe8c8" taskpriority="0" logused="1496" waitresource="KEY: 15:72059730480660480 (8b05ac458a46)" waittime="277" ownerId="51153050637" transactionname="implicit_transaction" lasttranstarted="2018-08-14T10:53:42.763" XDES="0x11c084bb8e0" lockMode="U" schedulerid="10" kpid="9048" status="suspended" spid="325" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2018-08-14T10:53:42.863" lastbatchcompleted="2018-08-14T10:53:42.840" lastattention="1900-01-01T00:00:00.840" clientapp="Microsoft JDBC Driver for SQL Server" hostname="zzz" hostpid="0" loginname="zzz" isolationlevel="read committed (2)" xactid="51153050637" currentdb="16" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
   <executionStack>
    <frame procname="adhoc" line="1" stmtstart="112" stmtend="318" sqlhandle="0x020000007e173f0d7450e209757f52677b92eb10d602872d0000000000000000000000000000000000000000">
unknown    </frame>
    <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
   </executionStack>
   <inputbuf>
(@P0 varchar(8000),@P1 bit,@P2 varchar(8000),@P3 bigint)Update WLWklstItem set BalAmt = @P0, InclInAggregBalInd = @P1 where WklstObjExtId = @P2 and RsnKey = @P3                                   </inputbuf>
  </process>
 </process-list>
 <resource-list>
  <keylock hobtid="72059730480660480" dbid="15" objectname="zzz" indexname="zzz" id="lockba2d46200" mode="U" associatedObjectId="72059730480660480">
   <owner-list>
    <owner id="process2c25088" mode="U" />
   </owner-list>
   <waiter-list>
    <waiter id="process2ccd468" mode="U" requestType="wait" />
   </waiter-list>
  </keylock>
  <keylock hobtid="72058563269558272" dbid="15" objectname="zzz" indexname="zzz" id="lock267784cc00" mode="X" associatedObjectId="72058563269558272">
   <owner-list>
    <owner id="process15be37fe8c8" mode="X" />
   </owner-list>
   <waiter-list>
    <waiter id="process2c25088" mode="U" requestType="wait" />
   </waiter-list>
  </keylock>
  <keylock hobtid="72059730480660480" dbid="15" objectname="zzz" indexname="zzz" id="lockba2d46200" mode="U" associatedObjectId="72059730480660480">
   <owner-list>
    <owner id="process2ccd468" mode="U" requestType="wait" />
   </owner-list>
   <waiter-list>
    <waiter id="process15be37fe8c8" mode="U" requestType="wait" />
   </waiter-list>
  </keylock>
 </resource-list>
</deadlock>
'

Моя цель - взять мой первый процесс жертвы (может быть два, но я просто забочусь о первом ребенке), а затемполучить SPID для соответствующего процесса.Я возился с приведенным ниже кодом, который я написал.

Первая строка кода работает, как и ожидалось;но мне нужно динамически получить свою первую детскую жертву, а не жестко кодировать процесс.Затем я экспериментировал со второй строкой кода, но это дало NULL-результат, который не является ожидаемым.Я что-то упустил ..

SELECT @myXML.value('(deadlock/process-list/process[@id = "process2ccd468"])[1]/@spid', 'INT')
SELECT @myXML.value('(deadlock/process-list/process[@id = (deadlock/victim-list/victimProcess)[1]/@id])[1]/@spid', 'INT')

Наконец, мне важны только первый [1] и второй [2] процессы в моем списке процессов.Есть ли способ объединить это в одном запросе xPath?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...