• I stumbled across this post looking for an answer. The link here says it is not possible to get back to the original row but that is not always true. With a low probability the below will return multiple rows because it uses a hash but typically I have found only one match.

    declare @databaseName varchar(100) = 'Your Database'--DatabaseName

    declare @keyValue varchar(100) = 'KEY: 10:72057600953614336 (0d0120c75d83)'--Output from deadlock graph

    declare @lockres varchar(100)

    declare @hobbitID bigint

    select @hobbitID = convert(bigint,RTRIM(SUBSTRING(@keyValue,CHARINDEX(':',@keyValue,CHARINDEX(':',@keyValue)+1)+1,

    CHARINDEX('(',@keyValue)-CHARINDEX(':',@keyValue,CHARINDEX(':',@keyValue)+1)-1)))

    select @lockRes = RTRIM(SUBSTRING(@keyValue,CHARINDEX('(',@keyValue)+1,CHARINDEX(')',@keyValue)-CHARINDEX('(',@keyValue)-1))

    declare @objectName sysname

    declare @ObjectLookupSQL as nvarchar(max) = '

    SELECT @objectName = o.name

    FROM '+@databaseName+'.sys.partitions p

    JOIN '+@databaseName+'.sys.indexes i ON p.index_id = i.index_id AND p.[object_id] = i.[object_id]

    join '+@databaseName+'.sys.objects o on o.object_id = i.object_id

    WHERE hobt_id = '+convert(nvarchar(50),@hobbitID)+'

    '

    exec sp_executesql @ObjectLookupSQL, N'@objectName sysname OUTPUT',@objectName=@objectName OUTPUT

    select @objectName

    declare @finalResult nvarchar(max) = N'select %%lockres%% ,*

    from '+@databaseName+'.dbo.' + @objectName + '

    where %%lockres%% = ''('+@lockRes+')''

    '

    exec sp_executesql @finalResult