2016-06-16 3 views
2

мне нужно обрезать количество строк в операторе отбора, поэтому вместо того, чтобы повторять несколько LTRIM (RTRIM («строка») вызывает, я создал простую функцию декоративную следующим образом:Почему выполнение скалярной функции приводит к операции «create function»?

create function dbo.trim(@String varchar(max)) 
returns varchar(max) 
as 
begin 
    return rtrim(ltrim(@String)) 
end 
go 

Однако, во время выполнение моего выбора (который вызывает функцию несколько раз) я запускаю следующее выбрать в отдельном окне, как ск:

SELECT sqltext.TEXT, 
req.session_id, 
req.status, 
req.command, 
req.cpu_time, 
req.total_elapsed_time 
FROM sys.dm_exec_requests req 
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext 

и соблюдайте следующие

TEXT session_id status command cpu_time total_elapsed_time 
------------------------------------------------------------------  
**  99   running SELECT 12045  12388 

, где первый столбец (заменен ** выше для удобства чтения) содержит следующее:

create function dbo.trim(@String varchar(max)) 
returns varchar(max) 
as 
begin 
    return rtrim(ltrim(@String)) 
end 

Могу ли я правильно интерпретировать это означает, что при вызове функции дифферента, что SQL Server фактически называет создание?

Как видно из приведенной выше таблицы, время выполнения довольно длительное, и в некоторых случаях я обнаружил, что операция create полностью зависает, блокируя завершение операций выбора и дальнейшей записи в базе данных таким образом, что я мне пришлось убить операцию.

Может ли кто-нибудь пролить свет на это?

Спасибо! Pab

ответ

2

Am Я правильно интерпретировать это означает, что при вызове функции дифферента , что SQL Server фактически называет создание?

Нет, SQL Server просто показывает полный текст модуля SQL, который включает в себя CREATE. Вы можете использовать statement_start_offset и statement_end_offsetto see the statement actually being executed.

SideNote: Вам лучше не использовать скалярные UDF для чего-то тривиального, как функция TRIM. Они имеют хорошо известные проблемы с производительностью. См. Converting A Scalar User Defined Function To A Inline Table Valued Function для альтернативного подхода, если это вообще нужно инкапсулировать в функцию.

+1

Спасибо Мартину! Я подозревал, что это может быть так. Я немного больше гуглинга, и я понимаю, что вы имеете в виду. Что касается проблем с производительностью, я думаю, что я получаю их вкус из первых рук. Я просто использую подход rtrim (ltrim ('the string')). – Pablito

+0

@Pablito yep - это не так много кода. –