1) Ce comportement est disponible dans SQL2005 -> SQL2008R2.
2) Pourquoi sys.dm_exec_sql_text.dbid
a (parfois) NULL ?
- Dans SQL2005 -> SQL2008R2
dbid
est NULL "pour les instructions SQL ad hoc et préparées" (voir MSDN pour SQL Server 2008 R2 ). - Dans SQL 2012 "Pour les instructions SQL ad hoc et préparées, l'ID de la base de données dans laquelle les instructions ont été compilées" (voir MSDN
). Donc, à partir de SQL2012
dbid
renverra une valeur non NULL incluant des "instructions SQL ad hoc et préparées".
3) Pour résoudre ce problème dans SQL2008 -> SQL2008R2 j'ai utilisé sys.dm_exec_plan_attributes
(voir 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