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
但是,执行需要很长时间。我搜索过但没有找到替代方案。
答案 0 :(得分:0)
是的,标量用户定义的函数通常会使查询变慢。有时很慢。 请参阅示例T-SQL User-Defined Functions: the good, the bad, and the ugly。
在你的情况下,我没有看到如何将标量函数重写为内联表值函数。
一个选项是在表中添加一个额外的列,用于保存标量函数计算的结果。您可以编写一个触发器,以便在主列更改时使其内容与主列保持同步。
它会降低更新和插入速度,但会加快SELECT
次查询速度。