共用方式為


sys.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 陳述式而言,則為編譯陳述式的資料庫識別碼。

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

請參閱

參考

DBCC INPUTBUFFER (Transact-SQL)

sys.sysprocesses (Transact-SQL)

sys.dm_exec_requests (Transact-SQL)