全角半角数字检测

简介

SQLSERVER2017 检测表的一个列里是否有全角数字。

内容

背景

一个老的系统里有一个表,一个列,本来只能接受半角的数字,
但数据定义为NVARCHAR(10),后面其他表也接收此列数据但定义是VARCHAR(10).
客户输入时把半角的2345 输入成全角的12345,
画面上看不出来,但后续处理时,由于后面的表定义不一致导致出错。

画面修改后,想知道数据库里是否用全角的垃圾,
于是。

解决方案

ASCII(X)0:9-(48:57)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

if exists(select * from dbo.sysobjects where id = object_id(N'[dbo].[fnComIsHalfAngleNumber]') and (type = 'FN' or type = 'TF'))
BEGIN
DROP FUNCTION fnComIsHalfAngleNumber
END
GO
-- =============================================
-- Author: tson1
-- Description: 半角数字检测
-- =============================================
CREATE FUNCTION dbo.fnComIsHalfAngleNumber
(
@vStr nvarchar(1000)
)
RETURNS bit
AS
BEGIN
declare @count as int ='1'
declare @tempChar as nchar(1)
declare @result as bit ='1'
declare @ascii as int
while(@count<=len(@vStr))
begin
set @tempChar =SUBSTRING(@vStr,@count,1)
set @ascii=ASCII(@tempChar)
if( not (@ascii>47 AND @ascii<58))
begin
set @result= '0'
break
end
set @count=@count+1;
end

return @result
END
GO

/*测试

select dbo.fnComIsHalfAngleNumber('123456') // 1
select dbo.fnComIsHalfAngleNumber('123456')//0
select dbo.fnComIsHalfAngleNumber('123456') //1
select dbo.fnComIsHalfAngleNumber('123456')//0

*/