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)