2016-10-11 10 views
1

SQL Server 2012 - ビュー(複雑)があり、列の1つに数字以外のものを取り除く必要があります。次の点が重要です。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を参照してください。

私の場合、スカラー関数をインラインテーブル値関数に書き換える方法はありません。

1つのオプションは、スカラー関数の計算結果を保持する余分な列をテーブルに追加することです。メインカラムの変更に合わせて、メインカラムとの同期を維持するトリガを作成することができます。

更新と挿入が遅くなりますが、SELECTのクエリは高速化されます。