1) Hành vi này có sẵn trong SQL2005 -> SQL2008R2.
2) Tại sao sys.dm_exec_sql_text.dbid
có (đôi khi) NULL?
- Trong SQL2005 -> SQL2008R2
dbid
là NULL "cho các câu lệnh SQL đặc biệt và chuẩn bị" (xem MSDN cho SQL Server 2008 R2 ). - Trong SQL 2012 "Đối với các câu lệnh SQL đặc biệt và chuẩn bị sẵn, ID của cơ sở dữ liệu nơi các câu lệnh được biên dịch" (xem MSDN
). Vì vậy, bắt đầu từ SQL2012
dbid
sẽ trả về giá trị không phải NULL, bao gồm "các câu lệnh SQL đặc biệt và đã chuẩn bị".
3) Để giải quyết vấn đề này trong SQL2008 -> SQL2008R2, tôi đã sử dụng sys.dm_exec_plan_attributes
(xem MSDN
)
SELECT ..., ISNULL(s2.dbid,CONVERT(SMALLINT,att.value)) AS my_dbid, ...
FROM sys.dm_exec_query_stats AS s1
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2
CROSS APPLY sys.dm_exec_plan_attributes(s1.plan_handle) att
WHERE att.attribute='dbid