У меня есть следующий 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?