DBCC INPUTBUFFER() is a very handy and easy to remember Database Console Command
to show what SQL a specific user (mapped to a SPID) is executing. BUT it only returns a maximum of 255 characters which is often not enough to show the full command being executed.
There are a couple of solutions to this, thankfully. First, however, we need to know which users are currently logged in and their associated SPID (Server Process Identifier). To do this we use the trusty system stored procedure sp_who2:
There are a couple of solutions to this, thankfully. First, however, we need to know which users are currently logged in and their associated SPID (Server Process Identifier). To do this we use the trusty system stored procedure sp_who2:
EXEC sp_who2
GO
Click to enlarge |
If we put the SPID we are interested in into:
DBCC INPUTBUFFER(54)
It returns the command being executed:
All well and good, but we can use this piece of code to return the full contents of the buffer:
Click to enlarge |
All well and good, but we can use this piece of code to return the full contents of the buffer:
USE master
GO
DECLARE @Handle BINARY (20)
SELECT @Handle = sql_handle
FROM sysprocesses
WHERE spid = 54
SELECT *
FROM ::fn_get_sql(@Handle)
Click to enlarge |
I have happily been using the above script for years now, but wait there's a problem - ::fn_get_sql is marked as deprecated and
though still currently available will be removed from future versions of SQL Server.
Therefore we are being encouraged to use the Dynamic Management Function sys.dm_exec_sql_text() to return the
text of commands. In the example below I have used sys.dm_exec_requests combined with the aforementioned function to return the
contents of the buffer:
DECLARE @spid INT
SET @spid = 54
SELECT r.session_id SPID
,r.STATUS
,r.command
,DB_NAME(database_id) 'DBName'
,t.TEXT
,wait_type
,last_wait_type
,percent_complete
,estimated_completion_time
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.session_id = @spid;
This is now my default way of dealing with this situation especially as we have some useful extra columns, however, remembering this (let alone typing it every time I need it) can
be a nuisance so I have created a "snippet" from it - a new feature of SQL Server Management Studio 2012 details of which will follow in another posting. Previous to this I used snippets with the aid of SSMS Tools Pack which was free prior to the 2012 version but probably still worth buying if you like the other features it provides.
BTW, have you ever wondered what the double colon :: was before the function name? It is one of the peculiarities of SQL server and is only used in a few instances, more details of which can be found at Karen Delaney's blog.
This piece of code is ideal for a Snippet.
Nice Article !
ReplyDeleteThis is my pleasure to read your article.
Really this will help to people of SQL Server Community.
I have also prepared one article about, Get last executed statement of lead blocker query using SQL Server DBCC Inputbuffer
You can also visit my article, your comments and reviews are most welcome.
http://www.dbrnd.com/2017/01/sql-server-dbcc-inputbuffer-to-find-the-last-statement-executed-by-a-spid-bloc-deadlock/