2016-06-08 3 views
0

У меня есть телефонные поля в базе данных, как следующее:тест PATINDEX для формата номер телефона

phone_num VARCHAR(50) NULL 

Это выглядит как почти все из этих телефонных полеев 10 символов или менее. Если они 10 символов, я отформатирую их в форме (xxx) xxx-xxxx.

CREATE FUNCTION [dbo].[FormatPhone](@Phone NVARCHAR(50)) RETURNS NVARCHAR(50) AS BEGIN 
    declare @fone NVARCHAR(50), @len INT; 
    set @fone=LTRIM(RTRIM(ISNULL(@Phone,''))); 
    set @len = LEN(@fone); 
    return case 
    when @len=10 then 
     '(' + SUBSTRING(@fone, 1, 3) + ') ' + 
     SUBSTRING(@fone, 4, 3) + '-' + 
     SUBSTRING(@fone, 7, 4) 
    when 10<@len then 
     '(' + SUBSTRING(@fone, 1, 3) + ') ' + 
     SUBSTRING(@fone, 4, 3) + '-' + 
     SUBSTRING(@fone, 7, 4) + 'x' + 
     SUBSTRING(@fone, 11, @len) 
    else 
     @fone 
    end; 
END 

Переменная @fone устраняет NULL значения и ведущие/ведомые пробелы.

Наше программное обеспечение вводит только номера телефонов с использованием числовых значений.

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

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

Или, они могут попробовать ввести его как xxx.xxx.xxxx, или ... ???? Кто знает?

Что такое хороший способ поиска переменной @fone для любых указаний, что она уже была изменена? Действительно ли PATINDEX?

+0

вы просто хотите знать, все ли вы данные в этом формате? (xxx) xxx-xxxx – chungtinhlakho

+0

Нет, но если это 10 цифр, я хочу вернуть его в этом формате. Если это всего лишь 7 цифр, я просто верну '1234567',' IsBlank' или что-то другое, что наш клиент решит использовать это поле. Если есть 10 цифр, «NNN.NNN.NNNN» или «NNN-NNN-NNNN», я могу вернуть «(NNN) NNN-NNNN'. Если от 11 до 15 цифр, я могу вернуть его в форме '(NNN) NNN-NNNNNNNN' (мне пришлось использовать N). – jp2code

ответ

0

Ответ Гордона был бы отличным, если бы мне разрешили войти и добавить ограничение.

Поскольку я не являюсь, я в конечном итоге, создавая следующую FormatPhone функцию для нашей базы данных:

-- ============================================= 
-- Author:  jp2code 
-- Create date: 09 June 2016 
-- Description: Formats a integer phone number value. 
-- ============================================= 
CREATE FUNCTION [dbo].[FormatPhone](@Phone NVARCHAR(50)) RETURNS NVARCHAR(50) AS BEGIN 
    declare @fone NVARCHAR(50), @len INT; 
    set @fone=LTRIM(RTRIM(ISNULL(@Phone,''))); 
    set @len = LEN(@fone); 
    if ISNUMERIC(@fone + '.0e0')=1 begin 
     return case 
      when @len=7 then 
       SUBSTRING(@fone, 1, 3) + '-' + 
       SUBSTRING(@fone, 4, 4) 
      when @len=8 then 
       SUBSTRING(@fone, 1, 1) + '-' + 
       SUBSTRING(@fone, 2, 3) + '-' + 
       SUBSTRING(@fone, 5, 4) 
      when @len=9 then 
       SUBSTRING(@fone, 1, 3) + '-' + 
       SUBSTRING(@fone, 4, 4) + ' x' + 
       SUBSTRING(@fone, 8, 2) 
      when @len=10 then 
       '(' + SUBSTRING(@fone, 1, 3) + ') ' + 
       SUBSTRING(@fone, 4, 3) + '-' + 
       SUBSTRING(@fone, 7, 4) 
      when 10<@len then 
       '(' + SUBSTRING(@fone, 1, 3) + ') ' + 
       SUBSTRING(@fone, 4, 3) + '-' + 
       SUBSTRING(@fone, 7, 4) + ' x' + 
       SUBSTRING(@fone, 11, @len) 
      else 
       @fone 
      end; 
    end 
    return @fone; 
END 

Вы можете использовать это или изменить его по своему усмотрению.

2

Хммм, зафиксировав все числа, я думаю, что вы хотите check ограничения:

alter table t 
    add constraint chk_t_phone_num 
     check (phone_num like '([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]); 

Это гарантирует, что значения введены в базу данных правильны.

+0

Это большая компания, Гордон, с тысячами клиентов, работающих с этой базой данных. Добавление такого ограничения потребует одобрения многих разных отделов, обучения различных администраторов компаний и т. Д. Я просто хочу изменить данные, возвращенные из представления. – jp2code