У меня есть некоторые данные, некоторые из них были импортированы с различными разделителями, такими как * -. или пробел ... некоторые из них были удалены при импорте, а некоторые - нет. Некоторые из внешних значений, сравниваемых с ним, имеют одинаковую проблему. Таким образом, мы удаляем все разделители и сравниваем это, я не хочу просто обновлять столбцы, пока данные не являются «моими».Функция скалера в месте, где положение действительно медленное? Как использовать Cross Apply вместо этого?
Так как я вижу это снова и снова в коде, я перехожу к хранимым процедурам, я написал сохраненную функцию, чтобы сделать это для меня.
ALTER FUNCTION [dbo].[fn_AccountNumber_Format2]
(@parAcctNum NVARCHAR(50))
RETURNS NVARCHAR(50)
AS
BEGIN
SET @parAcctNum = REPLACE(REPLACE(REPLACE(REPLACE(@parAcctNum, '.', ''), '*', ''), '-', ''), ' ', '');
RETURN @parAcctNum
END
Обычно запросы выглядели примерно так, и это занимает меньше секунды, чтобы запустить на несколько миллионов строк:
SELECT name1, accountID FROM tblAccounts WHERE (Replace(Replace(Replace(accountnumber, '.', ''), '*', ''), '-', '') = Replace(Replace(Replace('123-456-789', '.', ''), '*', ''), '-', ''));
Так что моя первая попытка с ним, как это занимает 24 секунд Выполнение выражений:
SELECT name1, accountID FROM tblAccounts WHERE (dbo.fn_AccountNumber_Format2 ([accountnumber])) = Replace(Replace(Replace('123-456-789', '.', ''), '*', ''), '-', '');
Это один 43 секунды:
SELECT name1, accountID FROM tblAccounts WHERE (dbo.fn_AccountNumber_Format2(accountnumber)) = (dbo.fn_AccountNumber_Format2 ('123-456-789'));
Итак, резкое замедление стало для меня полным шоком, так как я ожидал, что пользовательская функция будет работать точно так же, как и системная функция REPLACE ... После некоторых исследований по stackexchange и google кажется, что использование Cross Apply и создание таблица с функцией может быть лучшим решением, но я понятия не имею, как это работает, может ли кто-нибудь помочь мне с этим?