2013-04-12 83 views
0

我有一個三數據庫應用程序(我自己開發的),其中存儲了許多電話號碼,但它們的格式不一致(555-5555,(555)555-5555,5555555555,5555555,等等)在網絡方面,我希望他們總是像555-555-5555一樣顯示。我寫了一個標量函數來清理它們,但它會被稱爲OFTEN,我擔心它的效率。SQL標量函數的效率

你可以看看,如果有更好的方法,請告訴我。

ALTER FUNCTION [dbo].[FormatPhone] 
(
    @p AS VARCHAR(20) 
) RETURNS VARCHAR(12) AS 

BEGIN 
DECLARE @ret AS VARCHAR(12) = '' 
DECLARE @c AS CHAR 
DECLARE @i AS INT 
DECLARE @stop AS INT 

-- loop to grab only digits from @p 
SET @i = 1 
SET @stop = LEN(@p) 
WHILE @i <= @stop 
BEGIN 
    SET @c = SUBSTRING(@p, @i, 1) 
    IF @c >= '0' AND @c <= '9' SET @ret = @ret + @c 
    SET @i = @i + 1 
END 
IF LEN(@ret) = 7 SET @ret = '204' + @ret -- account for forgotten area code 

SET @ret = LEFT(@ret, 3) + '-' + SUBSTRING(@ret, 4, 3) + '-' + RIGHT(@ret, 4) 

RETURN @ret 

謝謝! Nick。

+1

一種http://codereview.stackexchange.com/問題嗎? –

+0

是的,使用循環會降低效率。我不是這方面的專家,但是使用服務器端功能簡單地從電話號碼中去掉所有非數字,然後在Web應用程序中格式化結果呢? –

回答

1
  • 更換所有haracters除了數字
  • 轉換成樣品XXX-XXX-XXXX

使用的串,更換T-SQL

+0

那麼,這樣的事情? 'SET @ret = REPLACE(REPLACE(REPLACE(REPLACE(@p,'(',''),')',''),' - ',''),'','')' –

+0

是的:)循環在RDBMS中是邪惡的。我的英文不好 – realnumber3012

+0

非常感謝!我會試一試。它肯定會出現**比做循環更快! –

2

你說什麼是數據清理。根據我的經驗(我有一個爲期6個月的俄羅斯業務部門項目,在電話號碼格式問題上大概有90%的問題是我的頭撞牆),這是一個很大的痛苦。

我對此的建議是做一次,然後正確地做;然後將系統置於適當的位置以防止髒數據將來進入系統。

我們最終做的是讓管理員辦公室裏的幾個女孩手工做到這一點!問題是,如果你做錯了,你會使數據無用。去自動分析,看看它到了哪裏,但有時人會跳動機器。

0

此功能着眼於數量/串的大小來確定和格式,輸出循環

CREATE Function [dbo].[FormatPhone] (@PD varchar(50)) 
RETURNS Varchar(50) 
As 
Begin 

Declare @F1 As tinyint 
Declare @F2 As tinyint 
Declare @F3 As tinyint 
Declare @F4 As tinyint 
Declare @F5 As tinyint 
Declare @F6 As tinyint 

Declare @NPD As Varchar(50) 

Declare @PDLen As tinyint 

--Trim any space off the ends 
SET @PD = RTRIM(LTRIM(@PD)) 

--Default just return the data, unless in proper foramt 
SET @NPD = @PD 

--Check for phone number that all ready has formatting, 
--we are only going to format a 'Pure' set of numbers. 
--Check for formating, space 
SET @F1 = CHARINDEX('(', @PD) 
SET @F2 = CHARINDEX(')', @PD) 
SET @F3 = CHARINDEX('-', @PD) 
SET @F4 = CHARINDEX('.', @PD) 
SET @F5 = CHARINDEX(' ', @PD) 
SET @F6 = @F1 [email protected] + @F3 + @F4 + @F5 


IF @F6 = 0 
--No formating, figure out the lenght 
BEGIN 
SET @PDLen = LEN(@PD) 

    IF @PDLen = 10 SET @NPD = '('+SUBSTRING(@PD, 1, 3)+') '+SUBSTRING(@PD, 4, 3)+'-'+SUBSTRING(@PD, 7, 4) 
    IF @PDLen = 11 AND SUBSTRING(@PD, 1, 1) = '1' SET @NPD = '('+SUBSTRING(@PD, 2, 3)+') '+SUBSTRING(@PD, 5, 3)+'-'+SUBSTRING(@PD, 8, 4) 
    IF @PDLen = 7 SET @NPD = '( ) '+SUBSTRING(@PD, 1, 3)+'-'+SUBSTRING(@PD, 4, 4) 

END 

RETURN @NPD 

END