fn_get_sql (Transact-SQL)

傳回指定 SQL 控制代碼之 SQL 陳述式的文字。

重要注意事項重要事項

未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。請改用 sys.dm_exec_sql_text。如需詳細資訊,請參閱<sys.dm_exec_sql_text (Transact-SQL)>。

主題連結圖示Transact-SQL 語法慣例

語法

sys.fn_get_sql ( SqlHandle )

引數

  • SqlHandle
    這是控制代碼值。SqlHandle 是 varbinary(64),沒有預設值。

傳回的資料表

資料行名稱

資料類型

描述

dbid

smallint

資料庫識別碼。特定 SQL 陳述式的這個值是 NULL。

objectid

int

資料庫物件的識別碼。特定 SQL 陳述式的這個值是 NULL。

number

smallint

如果將程序分組的話,便指出群組數目。

0 = 項目不是程序。

NULL = 特定 SQL 陳述式。

encrypted

bit

指出物件是否已經加密。

0 = 未加密

1 = 已加密

text

text

這是 SQL 陳述式的文字。加密物件的這個值是 NULL。

備註

您可以從 sys.dm_exec_requests (Transact-SQL) 動態管理檢視的 sql_handle 資料行中,取得有效的 SQL 控制代碼。

如果您傳遞已不在快取中的控制代碼,fn_get_sql 會傳回空的結果集。如果您傳遞無效的控制代碼,批次會停止,且會傳回錯誤訊息。

SQL Server Database Engine 無法快取某些 Transact-SQL 陳述式,例如大量複製陳述式和字串常值大於 8 KB 的陳述式。這些陳述式的控制代碼無法利用 fn_get_sql 來擷取。

對結果集的 text 資料行進行篩選,以找出可能含有密碼的文字。如需有關未受監視之安全性相關預存程序的詳細資訊,請參閱<篩選追蹤>。

fn_get_sql 函數會傳回與 DBCC INPUTBUFFER 命令相似的資訊。以下是何時因無法使用 DBCC INPUTBUFFER 而能夠使用 fn_get_sql 函數的範例:

  • 當事件超出 255 個字元時。

  • 當您必須傳回預存程序的最高目前巢狀層級時。例如,有名稱為 sp_1 和 sp_2 的兩個預存程序。如果 sp_1 呼叫 sp_2,且您在 sp_2 執行時,從 sys.dm_exec_requests 動態管理檢視中取得控制代碼,fn_get_sql 函數會傳回 sp_2 的相關資訊。另外,fn_get_sql 函數還會傳回最高目前巢狀層級的預存程序完整文字。

權限

使用者需要伺服器的 VIEW SERVER STATE 權限。

範例

資料庫管理員可以依照下列範例所示,利用 fn_get_sql 函數來協助診斷問題處理序。在管理員識別問題工作階段識別碼之後,管理員可以擷取該工作階段的 SQL 控制代碼,利用這個控制代碼來呼叫 fn_get_sql,再利用起始和結束位移來判斷問題工作階段識別碼的 SQL 文字。

DECLARE @Handle varbinary(64);
SELECT @Handle = sql_handle 
FROM sys.dm_exec_requests 
WHERE session_id = 52 and request_id = 0;
SELECT * FROM sys.fn_get_sql(@Handle);
GO