use Tempdb go if object_ID('fn_ACITEncryption') is not null drop function fn_ACITEncryption go create function fn_ACITEncryption ( @Str nvarchar(4000),--加密的字符串 @Flag bit=1,--1、加密 0、解密 @Key nvarchar(50)--密文 ) returns nvarchar(4000)--這里可轉換成二進制 with Encryption as begin Declare @LenStr int,@i int,@Str2 nvarchar(4000),@Split nvarchar(2),@LenKey int select @Str=@Str+'A',@LenStr=len(@Str),@i=1,@Str2='',@LenKey=Len(@Key+'A')-1 while @i<@LenStr select @Split=substring(@Str,@i,1), @Split=nchar((unicode(@Split)+case @Flag when 1 then unicode(substring(@Key+'A',@i%@LenKey+1,1))-1 when 0 then 65535-unicode(substring(@Key+'A',@i%@LenKey+1,1)) else 0 end)%65535+cast(@Flag as int)), @Str2=@Str2+@Split,@i=@i+1 return @Str2 end go select dbo.fn_ACITEncryption(N'Roy',1,'123') as 加密后字符串 /* 加密后字符串 ------------------------------ ¢ª (1 個資料列受到影響) */ select dbo.fn_ACITEncryption(N'¢ª',0,'123') as 解密后字符串 /* 解密后字符串 -------------------------- Roy (1 個資料列受到影響) */
http://blog.csdn.net/roy_88/archive/2009/11/12/4801917.aspx