SQL Server:更新表 - 数据掩码

时间:2014-09-23 18:34:01

标签: sql sql-server sql-server-2008 data-masking

我创建了一个数据掩码,在字符串中的任何位置找到一个16位数字,并用X&替换掉除了最后四个字符以外的所有字符。

但是,我不需要手动设置字符串,而是需要更新位于表中的列中的所有数据。到目前为止请查看我的代码:

DECLARE
    @NOTES AS VARCHAR(8000)

SET @NOTES = 'Returns the starting position of the first occurrence of a pattern in a specified  expression, 1234567891234567 or zeros if the pattern is not found, on all valid text and character data types'

SELECT 
   REPLACE(@NOTES, SUBSTRING(@NOTES, PATINDEX('%1%2%3%4%5%6%7%8%9%', @NOTES), 16), 'XXXXXXXXXXXX' + RIGHT(SUBSTRING(@NOTES, PATINDEX('%1%2%3%4%5%6%7%8%9%', @NOTES),16),4)) AS REPLACEMENT

非常感谢任何帮助: - )

2 个答案:

答案 0 :(得分:0)

使用您的逻辑

创建一个函数
CREATE FUNCTION MyMask(
    @NOTES  VARCHAR(8000))

    returns varchar(8000)

    BEGIN
    RETURN 
       REPLACE(@NOTES, SUBSTRING(@NOTES, PATINDEX('%1%2%3%4%5%6%7%8%9%', @NOTES), 16), 'XXXXXXXXXXXX' + RIGHT(SUBSTRING(@NOTES, PATINDEX('%1%2%3%4%5%6%7%8%9%', @NOTES),16),4))

    END

这是你使用它的人

update table
set field = dbo.myMask(field)
where some condition

答案 1 :(得分:0)

Horaciux提供的函数是一个静态声明的字符串,但在更新查询中使用时,PATINDEX总是设置为0.

解决方法是将PATINDEX的实施从PATINDEX('%1%2%3%4%5%6%7%8%9%'修改为PATINDEX('%[123456789]%'我已经包含了以下全部功能:

CREATE FUNCTION [dbo].[MyMask](@NOTES VARCHAR(8000)) RETURNS VARCHAR(8000)
BEGIN
RETURN 
    REPLACE(@NOTES, SUBSTRING(@NOTES, PATINDEX('%[123456789]%', @NOTES), 16), 'XXXXXXXXXXXX' + RIGHT(SUBSTRING(@NOTES, PATINDEX('%[123456789]%', @NOTES),16),4))
END

我希望这对其他人有用: - )