PATINDEX测试电话号码格式

时间:2016-06-08 22:07:13

标签: sql sql-server-2008 tsql

我在数据库中有以下电话字段:

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最好吗?

2 个答案:

答案 0 :(得分: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]);

这将确保放入数据库的值是正确的。

答案 1 :(得分: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

随意使用此功能或根据需要进行修改。