• I found that sys.dm_exec_requests has a Schedule_ID field in it.  You can join dm_io_pending_io_requests to it on that field.  Join to Exec_Requests and exec_sql_text and you can get what you are after.  the first query I got from Pinal Dave: Here

    Second query I came up with after looking at BOL.

    SELECT vfs.database_id, df.name, df.physical_name
    ,vfs.FILE_ID, ior.io_pending
    FROM sys.dm_io_pending_io_requests ior
    INNER JOIN sys.dm_io_virtual_file_stats (DB_ID(), NULL) vfs
    ON (vfs.file_handle = ior.io_handle)
    INNER JOIN sys.database_files df ON (df.FILE_ID = vfs.FILE_ID);
    GO

    SELECT    ipir.io_type, ipir.io_pending,
        ipir.scheduler_address, ipir.io_handle,
        os.scheduler_id, os.cpu_id, os.pending_disk_io_count,
        ER.session_id, ER.command, ER.cpu_time, ST.text

    FROM sys.dm_io_pending_io_requests ipir
    INNER JOIN sys.dm_os_schedulers os ON ipir.scheduler_address = os.scheduler_address
    INNER JOIN sys.dm_exec_requests AS ER ON os.scheduler_id = ER.Scheduler_id
    CROSS APPLY sys.dm_exec_sql_text(ER.sql_handle) AS ST

    Also, I'm not proficient with Extended Events, but I am wondering if you can create an XE session to get this information for you programmatically when the pending disk events occur.