我有一个屏蔽/加密函数,它循环遍历字符串的每个字符,并用表中的值替换它。表格的例子
Position OriginalValue MaskedValue
1 a t
1 b @
2 a r
我的功能适用于小型设备,但实际上大型表需要很长时间。有没有更好的方法来编写这个函数?
CREATE FUNCTION [dbo].[fn_SSNMask] (@string VARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @Mask AS VARCHAR(100)
SET @Mask= ''
DECLARE @Char AS CHAR(1)
DECLARE @Counter AS INT=1
DECLARE @CharReplace AS CHAR(1)
WHILE @Counter <= (select len(@string))
BEGIN
SET @Char=SUBSTRING(@string,@Counter,1)
SELECT @CharReplace =maskedvalue FROM dbo.Mask WHERE Position=@Counter AND originalvalue=@Char
SET @Mask=@Mask+ ISNULL(@CharReplace,@Char)
SET @Counter=@Counter + 1
SET @Char=NULL
SET @CharReplace=NULL
END
RETURN (@Mask)
END
答案 0 :(得分:4)
您应该废弃此方法,而是考虑使用几个配对的ENCRYPTBY
/ DECRYPTBY
内置函数之一:
修改强>
对于不需要解密的情况(即无法转换回原始值的单向转换),例如通常如何处理密码,您可以使用HASHBYTES函数,该函数可以执行以下算法:
SQL Server 2005及更新版本可以:
SQL Server 2012(及更新版)添加了以下内容:
上述所有功能(HASHBYTES
和ENCRYPTBY_____
)都会返回VARBINARY
。如果你需要字符串格式的那些十六进制数字,从SQL Server 2008开始的CONVERT函数添加了&#34; style&#34;数字1和2来处理这个问题:
;WITH cte AS
(
SELECT HASHBYTES('SHA2_512', N'test') AS [HashedValue]
)
SELECT cte.HashedValue, -- VARBINARY
CONVERT(VARCHAR(200), cte.HashedValue) AS [DefaultOrStyle0], -- converted
CONVERT(VARCHAR(200), cte.HashedValue, 1) AS [Style1], -- leading 0x
CONVERT(VARCHAR(200), cte.HashedValue, 2) AS [Style2] -- no leading 0x
FROM cte;