if?exists?(select?*?from?dbo.sysobjects?where?id?=?object_id(N'[dbo].[f_IP2Int]')?and?xtype?in?(N'FN',?N'IF',?N'TF')) drop?function?[dbo].[f_IP2Int] GO --1.?字符串IP地址轉換成IP數值函數。 CREATE?FUNCTION?dbo.f_IP2Int( @ip?char(15) )RETURNS?bigint AS BEGIN ????DECLARE?@re?bigint ????SET?@re=0 ????SELECT?@re=@re+LEFT(@ip,CHARINDEX('.',@ip+'.')-1)*ID ????????,@ip=STUFF(@ip,1,CHARINDEX('.',@ip+'.'),'') ????FROM( ????????SELECT?ID=CAST(16777216?as?bigint) ????????UNION?ALL?SELECT?65536 ????????UNION?ALL?SELECT?256 ????????UNION?ALL?SELECT?1)a ????RETURN(@re) END GO /**//*===========================================================*/ if?exists?(select?*?from?dbo.sysobjects?where?id?=?object_id(N'[dbo].[f_Int2IP]')?and?xtype?in?(N'FN',?N'IF',?N'TF')) drop?function?[dbo].[f_Int2IP] GO --1.?字符串IP地址轉換成IP數值函數。 CREATE?FUNCTION?dbo.f_Int2IP( @IP?bigint )RETURNS?varchar(15) AS BEGIN ????DECLARE?@re?varchar(15) ????SET?@re='' ????SELECT?@re=@re+'.'+CAST(@IP/ID?as?varchar) ????????,@IP=@IP%ID ????from( ????????SELECT?ID=CAST(16777216?as?bigint) ????????UNION?ALL?SELECT?65536 ????????UNION?ALL?SELECT?256 ????????UNION?ALL?SELECT?1)a ????RETURN(STUFF(@re,1,1,'')) END GO
if?exists?(select?*?from?dbo.sysobjects?where?id?=?object_id(N'[dbo].[f_SetStr]')?and?xtype?in?(N'FN',?N'IF',?N'TF')) drop?function?[dbo].[f_SetStr] GO --分段截取函數 CREATE?FUNCTION?dbo.f_SetStr( @s?varchar(8000),??????--包含數據項的字符串 @pos?int,?????????????--要更新的數據項的段 @value?varchar(100),???--更新后的值 @split?varchar(10)?????--數據分隔符 )RETURNS?varchar(8000) AS BEGIN ????DECLARE?@splitlen?int,@p1?int,@p2?int ????SELECT?@splitlen=LEN(@split+'a')-2, ????????@p1=1, ????????@p2=CHARINDEX(@split,@s+@split) ????WHILE?@pos>1?AND?@p1<=@p2 ????????SELECT?@pos=@pos-1, ????????????@p1=@p2+@splitlen+1, ????????????@p2=CHARINDEX(@split,@s+@split,@p1) ????RETURN(CASE ????????WHEN?@p1<@p2?THEN?STUFF(@s,@p1,@p2-@p1,@value) ????????WHEN?@p2>LEN(@s)?THEN?@s+@value ????????WHEN?@p2=@p1?THEN?STUFF(@s,@p1,0,@value)? ????????ELSE?@s?END) END GO
--各種字符串分函數 if?exists?(select?*?from?dbo.sysobjects?where?id?=?object_id(N'[dbo].[f_splitSTR]')?and?xtype?in?(N'FN',?N'IF',?N'TF')) drop?function?[dbo].[f_splitSTR] GO --3.2.1?循環截取法 CREATE?FUNCTION?f_splitSTR( @s???varchar(8000),???--待分拆的字符串 @split?varchar(10)?????--數據分隔符 )RETURNS?@re?TABLE(col?varchar(100)) AS BEGIN ????DECLARE?@splitlen?int ????SET?@splitlen=LEN(@split+'a')-2 ????WHILE?CHARINDEX(@split,@s)>0 ????BEGIN ????????INSERT?@re?VALUES(LEFT(@s,CHARINDEX(@split,@s)-1)) ????????SET?@s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'') ????END ????INSERT?@re?VALUES(@s) ????RETURN END GO /**//*==============================================*/ if?exists?(select?*?from?dbo.sysobjects?where?id?=?object_id(N'[dbo].[f_splitSTR]')?and?xtype?in?(N'FN',?N'IF',?N'TF')) drop?function?[dbo].[f_splitSTR] GO --3.2.3.1?使用臨時性分拆輔助表法 CREATE?FUNCTION?f_splitSTR( @s???varchar(8000),??--待分拆的字符串 @split?varchar(10)?????--數據分隔符 )RETURNS?@re?TABLE(col?varchar(100)) AS BEGIN ????--創建分拆處理的輔助表(用戶定義函數中只能操作表變量) ????DECLARE?@t?TABLE(ID?int?IDENTITY,b?bit) ????INSERT?@t(b)?SELECT?TOP?8000?0?FROM?syscolumns?a,syscolumns?b ????INSERT?@re?SELECT?SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID) ????FROM?@t ????WHERE?ID<=LEN(@s+'a')? ????????AND?CHARINDEX(@split,@split+@s,ID)=ID ????RETURN END GO /**//*==============================================*/ if?exists?(select?*?from?dbo.sysobjects?where?id?=?object_id(N'[dbo].[f_splitSTR]')?and?xtype?in?(N'FN',?N'IF',?N'TF')) drop?function?[dbo].[f_splitSTR] GO if?exists?(select?*?from?dbo.sysobjects?where?id?=?object_id(N'[dbo].[tb_splitSTR]')?and?objectproperty(id,N'IsUserTable')=1) drop?table?[dbo].[tb_splitSTR] GO --3.2.3.2?使用永久性分拆輔助表法 --字符串分拆輔助表 SELECT?TOP?8000?ID=IDENTITY(int,1,1)?INTO?dbo.tb_splitSTR FROM?syscolumns?a,syscolumns?b GO --字符串分拆處理函數 CREATE?FUNCTION?f_splitSTR( @s?????varchar(8000),??--待分拆的字符串 @split??varchar(10)?????--數據分隔符 )RETURNS?TABLE AS RETURN( ????SELECT?col=CAST(SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID)?as?varchar(100)) ????FROM?tb_splitSTR ????WHERE?ID<=LEN(@s+'a')? ????????AND?CHARINDEX(@split,@split+@s,ID)=ID) GO /**//*==============================================*/ if?exists?(select?*?from?dbo.sysobjects?where?id?=?object_id(N'[dbo].[f_splitSTR]')?and?xtype?in?(N'FN',?N'IF',?N'TF')) drop?function?[dbo].[f_splitSTR] GO --3.2.5?將數據項按數字與非數字再次拆份 CREATE?FUNCTION?f_splitSTR( @s???varchar(8000),????--待分拆的字符串 @split?varchar(10)?????--數據分隔符 )RETURNS?@re?TABLE(No?varchar(100),Value?varchar(20)) AS BEGIN ????--創建分拆處理的輔助表(用戶定義函數中只能操作表變量) ????DECLARE?@t?TABLE(ID?int?IDENTITY,b?bit) ????INSERT?@t(b)?SELECT?TOP?8000?0?FROM?syscolumns?a,syscolumns?b ????INSERT?@re? ????SELECT????No=REVERSE(STUFF(col,1,PATINDEX('%[^-^.^0-9]%',col+'a')-1,'')), ????????Value=REVERSE(LEFT(col,PATINDEX('%[^-^.^0-9]%',col+'a')-1)) ????FROM( ????????SELECT?col=REVERSE(SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID)) ????????FROM?@t ????????WHERE?ID<=LEN(@s+'a')? ????????????AND?CHARINDEX(@split,@split+@s,ID)=ID)a ????RETURN END GO /**//*==============================================*/ if?exists?(select?*?from?dbo.sysobjects?where?id?=?object_id(N'[dbo].[f_splitSTR]')?and?xtype?in?(N'FN',?N'IF',?N'TF')) drop?function?[dbo].[f_splitSTR] GO --3.2.6?分拆短信數據 CREATE?FUNCTION?f_splitSTR(@s?varchar(8000)) RETURNS?@re?TABLE(split?varchar(10),value?varchar(100)) AS BEGIN ????DECLARE?@splits?TABLE(split?varchar(10),splitlen?as?LEN(split)) ????INSERT?@splits(split) ????SELECT?'AC'?UNION?ALL ????SELECT?'BC'?UNION?ALL ????SELECT?'CC'?UNION?ALL ????SELECT?'DC'???? ????DECLARE?@pos1?int,@pos2?int,@split?varchar(10),@splitlen?int ????SELECT?TOP?1? ????????@pos1=1,@split=split,@splitlen=splitlen ????FROM?@splits ????WHERE?@s?LIKE?split+'%' ????WHILE?@pos1>0 ????BEGIN ????????SELECT?TOP?1 ????????????@pos2=CHARINDEX(split,@s,@splitlen+1) ????????FROM?@splits ????????WHERE?CHARINDEX(split,@s,@splitlen+1)>0 ????????ORDER?BY?CHARINDEX(split,@s,@splitlen+1) ????????IF?@@ROWCOUNT=0 ????????BEGIN ????????????INSERT?@re?VALUES(@split,STUFF(@s,1,@splitlen,'')) ????????????RETURN ????????END ????????ELSE ????????BEGIN ????????????INSERT?@re?VALUES(@split,SUBSTRING(@s,@splitlen+1,@pos2-@splitlen-1)) ????????????SELECT?TOP?1? ????????????????@pos1=1,@split=split,@splitlen=splitlen,@s=STUFF(@s,1,@pos2-1,'') ????????????FROM?@splits ????????????WHERE?STUFF(@s,1,@pos2-1,'')?LIKE?split+'%' ????????END ????END ????RETURN END GO
--分段截取函數
--分段截取函數
if?exists?(select?*?from?dbo.sysobjects?where?id?=?object_id(N'[dbo].[f_GetStr]')?and?xtype?in?(N'FN',?N'IF',?N'TF')) drop?function?[dbo].[f_GetStr] GO --分段截取函數 CREATE?FUNCTION?dbo.f_GetStr( @s?varchar(8000),??????--包含多個數據項的字符串 @pos?int,?????????????--要獲取的數據項的位置 @split?varchar(10)?????--數據分隔符 )RETURNS?varchar(100) AS BEGIN ????IF?@s?IS?NULL?RETURN(NULL) ????DECLARE?@splitlen?int ????SELECT?@splitlen=LEN(@split+'a')-2 ????WHILE?@pos>1?AND?CHARINDEX(@split,@s+@split)>0 ????????SELECT?@pos=@pos-1, ????????????@s=STUFF(@s,1,CHARINDEX(@split,@s+@split)+@splitlen,'') ????RETURN(ISNULL(LEFT(@s,CHARINDEX(@split,@s+@split)-1),'')) END GO
3 IP地址處理函數
if?exists?(select?*?from?dbo.sysobjects?where?id?=?object_id(N'[dbo].[f_IP2Int]')?and?xtype?in?(N'FN',?N'IF',?N'TF')) drop?function?[dbo].[f_IP2Int] GO --1.?字符串IP地址轉換成IP數值函數。 CREATE?FUNCTION?dbo.f_IP2Int( @ip?char(15) )RETURNS?bigint AS BEGIN ????DECLARE?@re?bigint ????SET?@re=0 ????SELECT?@re=@re+LEFT(@ip,CHARINDEX('.',@ip+'.')-1)*ID ????????,@ip=STUFF(@ip,1,CHARINDEX('.',@ip+'.'),'') ????FROM( ????????SELECT?ID=CAST(16777216?as?bigint) ????????UNION?ALL?SELECT?65536 ????????UNION?ALL?SELECT?256 ????????UNION?ALL?SELECT?1)a ????RETURN(@re) END GO /**//*===========================================================*/ if?exists?(select?*?from?dbo.sysobjects?where?id?=?object_id(N'[dbo].[f_Int2IP]')?and?xtype?in?(N'FN',?N'IF',?N'TF')) drop?function?[dbo].[f_Int2IP] GO --1.?字符串IP地址轉換成IP數值函數。 CREATE?FUNCTION?dbo.f_Int2IP( @IP?bigint )RETURNS?varchar(15) AS BEGIN ????DECLARE?@re?varchar(15) ????SET?@re='' ????SELECT?@re=@re+'.'+CAST(@IP/ID?as?varchar) ????????,@IP=@IP%ID ????from( ????????SELECT?ID=CAST(16777216?as?bigint) ????????UNION?ALL?SELECT?65536 ????????UNION?ALL?SELECT?256 ????????UNION?ALL?SELECT?1)a ????RETURN(STUFF(@re,1,1,'')) END GO
if?exists?(select?*?from?dbo.sysobjects?where?id?=?object_id(N'[dbo].[f_CompareSTR]')?and?xtype?in?(N'FN',?N'IF',?N'TF')) drop?function?[dbo].[f_CompareSTR] GO --1.?比較兩個字符串中包含的數據項是否相同的用戶定義函數: CREATE?FUNCTION?dbo.f_CompareSTR( @s1??varchar(8000),??--要比較的第一個字符串 @s2??varchar(8000),??--要比較的第二個字符串 @split?varchar(10)????--數據分隔符 )RETURNS?bit AS BEGIN ????IF?LEN(@s1)<>LEN(@s2)?RETURN(0) ????DECLARE?@r1?TABLE(col?varchar(100)) ????DECLARE?@r2?TABLE(col?varchar(100)) ????DECLARE?@splitlen?int ????SET?@splitlen=LEN(@split+'a')-2 ????WHILE?CHARINDEX(@split,@s1)>0 ????BEGIN ????????INSERT?@r1?VALUES(LEFT(@s1,CHARINDEX(@split,@s1)-1)) ????????SET?@s1=STUFF(@s1,1,CHARINDEX(@split,@s1)+@splitlen,'') ????END ????INSERT?@r1?VALUES(@s1) ????WHILE?CHARINDEX(@split,@s2)>0 ????BEGIN ????????INSERT?@r2?VALUES(LEFT(@s2,CHARINDEX(@split,@s2)-1)) ????????SET?@s2=STUFF(@s2,1,CHARINDEX(@split,@s2)+@splitlen,'') ????END ????INSERT?@r2?VALUES(@s2) ????RETURN(CASE ????????WHEN?EXISTS(SELECT?*?FROM?@r1?a?FULL?JOIN?@r2?b?ON?a.col=b.col?WHERE?a.col?IS?NULL?OR?b.col?IS?NULL) ????????THEN?0?ELSE?1?END) END GO /**//*================================================================*/ if?exists?(select?*?from?dbo.sysobjects?where?id?=?object_id(N'[dbo].[f_CompareSTR]')?and?xtype?in?(N'FN',?N'IF',?N'TF')) drop?function?[dbo].[f_CompareSTR] GO --2.比較兩個字符串中包含的數據項是否有任意一個相同 CREATE?FUNCTION?dbo.f_CompareSTR( @s1??varchar(8000),??--要比較的第一個字符串 @s2??varchar(8000),??--要比較的第二個字符串 @split?varchar(10)????--數據分隔符 )RETURNS?bit AS BEGIN ????DECLARE?@splitlen?int ????SET?@splitlen=LEN(@split+'a')-2 ????WHILE?CHARINDEX(@split,@s1)>0 ????BEGIN ????????IF?CHARINDEX(@split+LEFT(@s1,CHARINDEX(@split,@s1)-1)+@split,@split+@s2+@split)>0 ????????????RETURN(1) ????????SET?@s1=STUFF(@s1,1,CHARINDEX(@split,@s1)+@splitlen,'') ????END ????RETURN(CASE?WHEN?CHARINDEX(@split+@s1+@split,@split+@s2+@split)>0?THEN?1?ELSE?0?END) END