The Wayback Machine - http://web.archive.org/web/20121027213456/http://msdn.microsoft.com:80/zh-tw/library/ms189451(v=sql.90).aspx
本主題尚未接受評分 - 為這個主題評分

fn_get_sql (Transact-SQL)

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

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

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


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 動態管理檢視的 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 函數還會傳回最高目前巢狀層級的預存程序完整文字。

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

資料庫管理員可以依照下列範例所示,利用 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
本文對您有任何幫助嗎?
(剩餘 1500 個字元)
社群內容 新增
Image
Microsoft 正展開一份線上問卷調查,了解您對於 MSDN 網站的看法。 如果您選擇參加,您離開 MSDN 網站時即會顯示線上問卷調查。

您是否想要參加?