sys.fn_get_sql (Transact-SQL)
傳回指定 SQL 控制代碼之 SQL 陳述式的文字。
重要事項 |
---|
未來的 Microsoft SQL Server 版本將移除這項功能。 請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。 請改用 sys.dm_exec_sql_text。 如需詳細資訊,請參閱<sys.dm_exec_sql_text (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)