2016-10-11 2 views
-1

У меня есть номер телефона в базе данных. У него уже есть данные.Изменить номер телефона

Я хочу изменить формат своего телефона на «XXX-XXX-XXXX» В текущей базе данных нет ни одного телефона.

Таким образом, могут быть данные мусора. Я уже применял валидацию для новых записей, но теперь хочу также изменить существующие данные.

Есть ли какой-либо конкретный способ, чтобы я мог изменить существующие данные. И сделайте все номера телефонов, чтобы следовать этому формату.

Прошу совета.

+3

сдирать все нечисловых символов из базы данных, и применить любой желаемое форматирование 1. в клиентском приложении; 2. в SQL, который выбирает данные из базы данных; или 3.создайте вычисленный столбец в таблице, который применит форматирование для вас «на лету» и «Выберите» этот столбец вместо значения неформатированного столбца –

+0

Ну, я хочу это сделать. Но как? Любой запрос поможет много. –

+1

Сначала вам нужно удалить все существующие символы форматирования. Наиболее вероятными символами являются() - и пробел. Мое предпочтение заключалось бы в том, чтобы оставить форматирование передним приложением и получить все символы форматирования и логику из базы данных. –

ответ

2

Создать функцию для удаления нечисловых данных и сделать форматирование

CREATE FUNCTION [UDF_STRIP_NONNUMERIC_DATA](@str VARCHAR(8000)) 
RETURNS VARCHAR(8000) 
AS 
    BEGIN 
     WHILE Patindex('%[^0-9]%', @str) > 0 
     BEGIN 
      SET @str = Stuff(@str, Patindex('%[^0-9]%', @str), 1, '') 
     END 

     RETURN @str 
    END 

Вы можете использовать STUFF функции вставки в - между phone номером

Select left(Stuff(Stuff(dbo.[UDF_STRIP_NONNUMERIC_DATA](Phone),4,0,'-'),8,0,'-'),12) 
From yourtable 

Если вы используете SQL SERVER 2012+ использования, может используйте функцию FORMAT (спасибо LukStorms, кто упомянул об этом в комментарии)

SELECT Format(Cast(dbo.[Udf_strip_nonnumeric_data](Phone) AS BIGINT), '###-###-####') 
FROM yourtable 

Чтобы обновить

Update yourtable 
    SET phone = left(Stuff(Stuff(dbo.[UDF_STRIP_NONNUMERIC_DATA](Phone),4,0,'-'),8,0,'-'),12) 

Demo

declare @str varchar(100)= '9225-123-4567' 

select left(Stuff(Stuff(dbo.[UDF_STRIP_NONNUMERIC_DATA](@str),4,0,'-'),8,0,'-'),12) 

Результат:922-512-3456

+0

Не работает как ожидалось Старые данные: 9225-123-4567 - С помощью вашего запроса преобразован в: 92-5-1-3-4567 –

+0

Теперь он не работает с записями, которые имеют правильные данные. Попробуйте «555-555-5555». Он будет преобразован в «555-555-55» –

+0

@PiyushKhatri обновленный чек сейчас –

0

Ok, чтобы заменить все нечисловые символы, смотрите на this.

Вот пример сценарий (копируется из этой ссылки), чтобы показать вам, как это работает (Вы должны изменить это, чтобы соответствовать своему имени и имена столбцов таблицы:

-- Step 1: creates table to use to hold every char in every phone number 
if object_id('dbo.tally') is not null drop table dbo.tally 
    select top 10000 --change to fit max length of phone number 
    identity(int,1,1) as n 
    into dbo.tally 
    from master.dbo.syscolumns sc1, 
     master.dbo.syscolumns sc2 

-- add pk to maximize performance 
    alter table dbo.tally 
    add constraint pk_tally_n 
     primary key clustered (n) with fillfactor = 100 

-- Step 2: Create temporary table holding three bad phone numbers 
declare @phonetable table 
    (uniqueid int identity(1,1), 
    phone_number varchar(500)) 
    insert into @phonetable (phone_number) 
    select '-567-890' union 
    select 'ext' union 
    select 'n/a' union select '...12345.....'; 

-- Step 3: identify, for every character, whether it is a number or not, 
      and remove the non-numeric ones 
with cte (uniqueid, phone_number, goodchar, badchar) as 
(select uniqueid, phone_number, 
     case when substring(phone_number,N,1) not like '%[^0-9]%' 
      then substring(phone_number,N,1) end as goodchar, 
     case when substring(phone_number,N,1) like '%[^0-9]%' 
      then substring(phone_number,N,1) end as badchar 
    from @phonetable , Tally 
    where phone_number like '%[^0-9]%' and N <= len(phone_number)) 
    select distinct phone_number, 
     isnull(stuff ( 
        (SELECT '' + goodchar 
       FROM cte t1 
     where t1.UniqueID = t2.UniqueID 
      FOR XML PATH ('')) , 1 , 0 , '') ,'') 
         as clean_phone_number from cte t2 

для отображения чисел с форматирование, просто извлечь соответствующие части и вновь объединить их с черточками.

Select case len(phone) 
     When 10 then left(phone, 3) + '-' + 
        substring(phone, 4,3) + '-' + 
        substring(phone, 7,4)` 
     When 7 then left(phone, 3) + '-' + 
        substring(phone, 4,4) 
     Else '' end 

Чтобы создать вычисляемый столбец

Alter table Add Column FormattedPhone as 
    case len(phone) 
     When 10 then left(phone, 3) + '-' + 
        substring(phone, 4,3) + '-' + 
        substring(phone, 7,4)` 
     When 7 then left(phone, 3) + '-' + 
        substring(phone, 4,4) 
     Else '' end 
1
declare @phone varchar(24) 
set @phone = '(334)789-4532' 
--set @phone = '314789-4532' 
--set @phone = '3457894532' 
--set @phone = '534-789-4532' 

SELECT 
    LEFT(N,3) + '-' + SUBSTRING(N,4,3) + '-' + RIGHT(N,4) 
FROM 
    (SELECT CAST(CAST((
      SELECT SUBSTRING(@phone, Number, 1) 
      FROM master..spt_values 
      WHERE Type='p' AND Number <= LEN(@phone) AND 
       SUBSTRING(@phone, Number, 1) LIKE '[0-9]' FOR XML Path('')) 
     AS xml) AS varchar(MAX)) as N) as N 
0

Если вы не возражаете UDF

Select [dbo].[udf-Str-Format-Phone]('334)789-4532') 

Возвращает

334-789-4532 

ОДС

CREATE FUNCTION [dbo].[udf-Str-Format-Phone] (@S varchar(max)) 
Returns varchar(25) 
AS 
Begin 
    Declare @Return varchar(25) 

    ;with cte0(N) As (Select 1 From (Values(1),(1),(1),(1),(1)) N(N)) 
     , cteN(N) As (Select Top (Len(@S)) Row_Number() over (Order By (Select NULL)) From cte0 N1, cte0 N2) 
     , cteS(S) As (Select Substring(@S,N,1) From cteN Where Substring(@S, N, 1) LIKE '[0-9]' FOR XML Path('')) 

    Select @Return = IIf(Len(S)>=10,Stuff(stuff(S,4,0,'-'),8,0,'-'),Stuff(S,4,0,'-')) From cteS 
    Return @Return 

End 
-- Syntax : Select [dbo].[udf-Str-Format-Phone]('(334)789-4532') -- Returns 334-789-4532 
-- Syntax : Select [dbo].[udf-Str-Format-Phone]('Phone:7894532') -- Returns 789-4532 
Смежные вопросы