根据身份证号码取得此CID所在省份,用函数处理

作者: 医学科学  发布:2019-10-07

create function f_getcityfromcid (@cid varchar(18))   
returns varchar(50)   
as  
begin    
 
    declare @acity varchar(1000)   
    set @acity = '____,____,____,____,____,____,____,____,____,____,____,北京__,天津__,河北__,山西__,内蒙古_,____,____,____,____,____,辽宁__,吉林__,黑龙江_,____,____,____,____,____,____,____,上海__,江苏__,浙江__,安微__,福建__,江西__,山东__,____,____,____,河南__,湖北__,湖南__,广东__,广西__,海南__,____,____,____,重庆__,四川__,贵州__,云南__,西藏__,____,____,____,____,____,____,陕西__,甘肃__,青海__,宁夏__,新疆__,____,____,____,____,____,台湾__,____,____,____,____,____,____,____,____,____,香港__,澳门__,____,____,____,____,____,____,____,____,国外__,'  
 
 
    set @cid = upper(@cid)   
 
    IF (len(@cid) <> 18 OR patindex('%[^0-9X]%',@cid) > 0)   
        RETURN '你小子骗我,这不是合法的身份证'  
 
    IF substring(@acity,cast(left(@cid,2) as int)* 5+1,4) = ''    
        RETURN '你小子骗我,这身份证的地区码不存在'  
 
 
    RETURN '这小子是:'+replace(substring(@acity,cast(left(@cid,2) as int)* 5+1,4),'_','')   
 
end   
go   
 
select dbo.f_getcityfromcid('32108519760502ttt9')   
/*  
--------------------------------------------------   
你小子骗我,这不是合法的身份证  
 
(所影响的行数为 1 行)  
 
*/  
--select dbo.f_getcityfromcid('321085196612026119')   

 

例1

/*  
--------------------------------------------------   
这小子是:江苏  
 
(所影响的行数为 1 行)  
 
 
*/  
drop function f_getcityfromcid  

图片 1
图片 2--1、如果提取小写字母:
图片 3
图片 4create function roy_Number(@name varchar(100))
图片 5returns varchar(100)
图片 6as
图片 7begin
图片 8
图片 9    declare @s varchar(100)
图片 10
图片 11    while patindex('%[a-z]%',@name collate Chinese_PRC_BIN)>0--用二进制排序区分大小写
图片 12
图片 13        begin
图片 14
图片 15            set @s=isnull(@s,'')+substring(@name,patindex('%[a-z]%',@name collate Chinese_PRC_BIN),1)
图片 16
图片 17            set @name=stuff(@name,1,patindex('%[a-z]%',@name collate Chinese_PRC_BIN),'')
图片 18
图片 19        end
图片 20
图片 21    return @s
图片 22end
图片 23
图片 24go
图片 25
图片 26--测试:
图片 27
图片 28declare @s varchar(100)
图片 29
图片 30set @s='CHINA,r~!@#$o%^&*(y,&.;)(*wu^x%i943中8国$@人'
图片 31
图片 32select dbo.roy_Number(@s) as 显示小写字母
图片 33
图片 34
图片 35图片 36/**//*
图片 37显示小写字母                                                                                               
图片 38---------------------------------------------------------------------------------------------------- 
图片 39roywuxi
图片 40
图片 41(所影响的行数为 1 行)
图片 42
图片 43*/
图片 44
图片 45--drop function roy_Number
图片 46
图片 47
图片 48                                           
图片 49
图片 50go
图片 51
图片 52--2、找出第一个字符串没有在第二个字符串出现的字符
图片 53

代码如下 复制代码
create function f_split(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(a varchar(100))
--实现split功能 的函数
--date :2003-10-14
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>''
insert @temp values(@SourceSql)
return
end

create function fn_Split(

select * from dbo.f_split('1,2,3,4',',')

                    @s1nvarchar(50),

a

1
2
3
4

(所影响的行数为 4 行)

例2

代码如下 复制代码
--SQL Server Split函数
--Author:zc_0101
--说明:
--支持分割符多字节
--使用方法
--Select * FROM DBO.F_SQLSERVER_SPLIT('1203401230105045','0')
--select * from DBO.F_SQLSERVER_SPLIT('abc1234a12348991234','1234')
--Select * from DBO.F_SQLSERVER_SPLIT('ABC',',')

CREATE FUNCTION F_SQLSERVER_SPLIT(@Long_str varchar(8000),@split_str varchar(100))
RETURNS @tmp TABLE(
ID inT IDENTITY PRIMARY KEY,
short_str varchar(8000)
)
AS
BEGIN
DECLARE @long_str_Tmp varchar(8000),@short_str varchar(8000),@split_str_length int
SET @split_str_length = LEN(@split_str)
IF CHARINDEX(@split_str,@Long_str)=1
SET @long_str_Tmp=SUBSTRING(@Long_str,@split_str_length+1,LEN(@Long_str)-@split_str_length)
ELSE
SET @long_str_Tmp=@Long_str
IF CHARINDEX(REVERSE(@split_str),REVERSE(@long_str_Tmp))>1
SET @long_str_Tmp=@long_str_Tmp+@split_str
ELSE
SET @long_str_Tmp=@long_str_Tmp
IF CHARINDEX(@split_str,@long_str_Tmp)=0
Insert INTO @tmp select @long_str_Tmp
ELSE
BEGIN
WHILE CHARINDEX(@spl(www.111cn.net)it_str,@long_str_Tmp)>0
BEGIN
SET @short_str=SUBSTRING(@long_str_Tmp,1,CHARINDEX(@split_str,@long_str_Tmp)-1)
DECLARE @long_str_Tmp_LEN INT,@split_str_Position_END int
SET @long_str_Tmp_LEN = LEN(@long_str_Tmp)
SET @split_str_Position_END = LEN(@short_str)+@split_str_length
SET @long_str_Tmp=REVERSE(SUBSTRING(REVERSE(@long_str_Tmp),1,@long_str_Tmp_LEN-@split_str_Position_END))
IF @short_str<>'' Insert INTO @tmp select @short_str
END
END
RETURN
END

例3

Sql2000andSql2005实用的Split函数

 

代码如下 复制代码
sql2000
CREATE FUNCTION [dbo].[splitstring_array]
(
@string nvarchar(4000),@split char(1)
)

RETURNS @array table
(
oneStr nvarchar(100)
)

AS

BEGIN
declare @v_code varchar(60)

--zell 2006-05-26
--set @string = replace(@string,' ',@split)
--set @string = replace(@string,',',@split)

while len(@string) > 0
begin
if charindex(@split,@string,1) != 0
begin
set @v_code = substring(@string,1,charindex(@split,@string,1)-1)
set @string = substring(@string,charindex(@split,@string,1)+1,len(@string))
end
else if charindex(@split,@string,1) = 0
begin
set @v_code = @string
set @string = ''
end
insert into @array(onestr) values(@v_code)
end
RETURN
END

sql2005
CREATE function [dbo].[func_splitid]
(@str varchar(max),@split varchar(10))
RETURNS @t Table (c1 nvarchar(100))
AS
BEGIN
DECLARE @x XML
SET @x = CONVERT(XML,'<items><item id="' + REPLACE(@str, @split, '"/><item id="') + '"/></items>')
INSERT INTO @t SELECT x.item.value('@id[1]', 'nvarchar(100)') FROM @x.nodes('//items/item') AS x(item)
RETURN
END
from:

                    @s2nvarchar(50),

                    @splitnvarchar(50)--分隔符

)

returns nvarchar(50)

as

begin

   

    declare @s3 nvarchar(50),@lenSplit int

   

本文由金沙澳门官网发布于医学科学,转载请注明出处:根据身份证号码取得此CID所在省份,用函数处理

关键词: