我在数据库中有以下电话字段:
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 :(得分: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
随意使用此功能或根据需要进行修改。