sys.fn_get_sql (Transact-SQL)

Область применения: SQL Server

Возвращает текст инструкции 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) без значения по умолчанию.

Возвращаемые таблицы

Имя столбца Тип данных Description
dbid smallint Идентификатор базы данных. Для нерегламентированных и подготовленных инструкций SQL это идентификатор базы данных, в которой происходила компиляция инструкции.
objectid int Идентификатор объекта базы данных. Имеет значение NULL для нерегламентированных инструкций SQL.
number smallint Указывает на номер группы, если процедуры сгруппированы.

0 = записи не являются процедурами.

NULL = нерегламентированные инструкции SQL.
encrypted bit Указывает, зашифрован ли объект.

0 = не зашифрована

1 = зашифрована
text text Текст инструкции SQL. Имеет значение NULL для зашифрованных объектов.

Замечания

Допустимый дескриптор SQL можно получить из столбца sql_handle динамического управления sys.dm_exec_requests (Transact-SQL ).

Если передать дескриптор, который больше не существует в кэше, fn_get_sql возвращает пустой результирующий набор. Если передается недопустимый дескриптор, выполнение пакета прекращается и возвращается сообщение об ошибке.

Sql Server ядро СУБД не может кэшировать некоторые инструкции Transact-SQL, такие как инструкции массового копирования и инструкции со строковыми литералами, размер которых превышает 8 КБ. Дескрипторы этих инструкций не могут быть извлечены при помощи функции fn_get_sql.

Текстовый столбец результирующий набор фильтруется по тексту, который может содержать пароли. Дополнительные сведения о связанных с безопасностью хранимых процедурах, которые не отслеживаются, см. в разделе "Фильтрация трассировки".

Функция fn_get_sql возвращает сведения, аналогичные команде DBCC INPUTBUFFER . Ниже приведены случаи, когда функцию fn_get_sql использовать можно, а команду DBCC INPUTBUFFER — нельзя:

  • если событие содержит более чем 255 символов;

  • если необходимо получить наивысший из текущих уровней вложенности хранимой процедуры. Например, есть две хранимые процедуры с именами sp_1 и sp_2. Если процедура sp_1 вызывает процедуру sp_2 и вы получаете дескриптор из динамического административного представления sys.dm_exec_requests во время выполнения процедуры sp_2, функция fn_get_sql возвращает сведения о процедуре sp_2. Кроме того, функция fn_get_sql возвращает полный текст хранимой процедуры на высшем текущем уровне вложенности.

Разрешения

Пользователю необходимо разрешение VIEW SERVER STATE на сервере.

Примеры

Администраторы базы данных могут использовать функцию fn_get_sql, как показано в следующем примере, для облегчения диагностики проблемных процессов. После того как администратор находит проблемный идентификатор сеанса, он может получить дескриптор SQL для идентификатора сеанса, вызвать функцию n_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)