sql标量值函数非常慢

时间:2016-10-11 21:46:03

标签: sql sql-server tsql sql-server-2012 stored-functions

SQL Server 2012 - 我有一个视图(复杂),其中一列需要删除任何非数字的内容。以下是有用的;

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 个答案:

答案 0 :(得分:0)

是的,标量用户定义的函数通常会使查询变慢。有时很慢。 请参阅示例T-SQL User-Defined Functions: the good, the bad, and the ugly

在你的情况下,我没有看到如何将标量函数重写为内联表值函数。

一个选项是在表中添加一个额外的列,用于保存标量函数计算的结果。您可以编写一个触发器,以便在主列更改时使其内容与主列保持同步。

它会降低更新和插入速度,但会加快SELECT次查询速度。