2013-11-24 49 views
4

我從DMF sys.dm_exec_sql_text沒有顯示DBID

http://technet.microsoft.com/en-us/library/ms181929.aspx

SELECT s2.dbid, 
    s1.sql_handle, 
    (SELECT TOP 1 SUBSTRING(s2.text,statement_start_offset/2+1 , 
     ((CASE WHEN statement_end_offset = -1 
     THEN (LEN(CONVERT(nvarchar(max),s2.text)) * 2) 
     ELSE statement_end_offset END) - statement_start_offset)/2+1)) AS sql_statement, 
    execution_count, 
    plan_generation_num, 
    last_execution_time, 
    total_worker_time, 
    last_worker_time, 
    min_worker_time, 
    max_worker_time, 
    total_physical_reads, 
    last_physical_reads, 
    min_physical_reads, 
    max_physical_reads, 
    total_logical_writes, 
    last_logical_writes, 
    min_logical_writes, 
    max_logical_writes 
FROM sys.dm_exec_query_stats AS s1 
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2 
WHERE s2.objectid is null 
ORDER BY s1.sql_handle, s1.statement_start_offset, s1.statement_end_offset; 

當我執行它dbid字段返回爲空得到這個查詢。 enter image description here 爲什麼這樣表現? 我想限制從一個數據庫查詢,但它似乎無法正常工作。

非常感謝您的答案之前。

回答

5

1)此行爲在SQL2005 - > SQL2008R2中可用。

2)爲什麼sys.dm_exec_sql_text.dbid有(有時)NULL?

  • 在SQL2005 - > SQL2008R2 dbid是NULL 「爲專案,準備SQL語句」(查看MSDN瞭解SQL Server 2008 R2)。
  • 在SQL 2012中「對於臨時和準備好的SQL語句,編譯語句的數據庫的ID」(請參閱​​MSDN)。因此,從SQL2012 dbid開始,將返回一個非NULL值,包括「臨時和準備好的SQL語句」。

3)在SQL2008解決這個問題 - > SQL2008R2我用sys.dm_exec_plan_attributes(見MSDN

1

我在Microsoft連接上找到這個this post。它解釋了dbid可以通過以下方式爲空:

Sql_handle是一個哈希值,用於標識提交給服務器的批處理的SQL文本。由於它僅識別文本,因此可以針對不同的數據庫提交併且仍然相同。因此,sql_handle不能唯一地標識這個批處理/查詢針對特定語句提交的數據庫。

另一方面,存儲過程始終擁有駐留的數據庫,因此我們可以填充此列。

+0

你的意思是我應該使用使用<數據庫名稱>? –

+1

不,我不認爲它會爲某些類型的查詢返回'dbid'。 – Szymon