fn_get_sql (Transact-SQL)
傳回指定 SQL 控制代碼之 SQL 陳述式的文字。
重要事項: |
|---|
| 未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。請改用 sys.dm_exec_sql_text。如需詳細資訊,請參閱<sys.dm_exec_sql_text>。 |
您可以從 sys.dm_exec_requests 動態管理檢視的 sql_handle 資料行中,取得有效的 SQL 控制代碼。
如果您傳遞已不在快取中的控制代碼,fn_get_sql 會傳回空的結果集。如果您傳遞無效的控制代碼,批次會停止,且會傳回錯誤訊息。
Microsoft SQL Server 2005 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 函數還會傳回最高目前巢狀層級的預存程序完整文字。
資料庫管理員可以依照下列範例所示,利用 fn_get_sql 函數來協助診斷問題處理序。在管理員識別問題 session_id 之後,管理員可以擷取這個 session_id 的 SQL 控制代碼,利用這個控制代碼來呼叫 fn_get_sql,再利用起始和結束位移來判斷問題 session_id 的 SQL 文字。
DECLARE @Handle varbinary(64); SELECT @Handle = sql_handle FROM sys.dm_exec_requests WHERE session_id = 52 and request_id = 0; SELECT * FROM ::fn_get_sql(@Handle); GO


重要事項: