2016-10-11 2 views
1

SQL Server 2012 - У меня есть представление (сложное), и один из столбцов должен иметь что-то нечисловое. Следующее работает до определенного момента;sql-скалярные функции невероятно медленные

STUFF(dbo.campaign_tracking_clicks.tt_cpn, 1, PATINDEX('%[0-9]%', dbo.campaign_tracking_clicks.tt_cpn) - 1, '') AS emailerid 

Я получаю сообщение об ошибке, если что-то, кроме цифр, находится в конце значения.

У меня есть скалярная функция»

/****** Object: UserDefinedFunction [dbo].[KeepNumCharacters] Script Date: 10/11/2016 1:05:51 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER Function [dbo].[KeepNumCharacters](@Temp VarChar(100)) Returns VarChar(100) 
AS 
Begin  
While PatIndex('%[^0-9]%', @Temp) > 0 
Set @Temp = Stuff(@Temp, PatIndex('%[^0-9+]%', @Temp), 1, '')  
    Return @TEmp 
End 

Я использую;

dbo.KeepNumCharacters(dbo.campaign_tracking_clicks.tt_cpn) AS emailerid 

Но для этого требуется очень много времени. Я искал и искал, но не нашел альтернативы.

+1

Похоже, что эти данные должны быть в его собственном поле. – Missy

+0

У меня нет такой роскоши. – user990016

+0

Сколько строк у вас в таблице? –

ответ

0

Да, скалярные пользовательские функции часто делают запросы медленными. Иногда очень медленно. См., Например, T-SQL User-Defined Functions: the good, the bad, and the ugly.

В вашем случае я не вижу, как переписать скалярную функцию в встроенную функцию, ориентированную на таблицу.

Один из вариантов - добавить дополнительный столбец в таблицу, который будет содержать результат вычислений скалярной функции. Вы можете написать триггер, который будет синхронизировать его содержимое с основным столбцом при изменении основного столбца.

Это замедлит обновления и вставки, но это ускорит ваши запросы SELECT.