【发布时间】:2015-01-08 18:33:37
【问题描述】:
我有一个屏蔽/加密函数,它遍历字符串的每个字符并将其替换为表中的值。表格示例
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
【问题讨论】:
-
用正则表达式替换应该会更快,所以c#或python可以做得更好。如果你可以定义CLR函数,那么你可以在SQL Server中使用它,这样会更快。
-
CLR 在我的环境中不是一个选项。
-
你的函数叫做 SSNMask。您正在实施Ceasar Cipher 到什么目的?它是可逆的,可能会愚弄一个 3 岁的孩子,但极不可能保护数据不被任何有一点智慧的人窃取
-
为什么方法效率低?您正在枚举
@string参数中的每个字符,可能是 100 个字符。对于其中的每一个,您都在对 Mask 表进行查找,然后构建一个新字符串并返回它。然后,您为传入的每一行执行该任务。如果提供的 SSN 是 111-11-1111,您将执行 11 次相同的查找,并且只生成 2 个唯一值。
标签: sql sql-server encryption user-defined-functions