-1

我创建了一个数据掩码,它可以在字符串中的任意位置找到一个 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

任何帮助将非常感激 :-)

4

2 回答 2

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

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

于 2014-09-25T10:51:06.243 回答
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
于 2014-09-23T18:49:11.463 回答