2012-01-27 63 views
1

我需要对拥有超过100万条记录的表进行更新以屏蔽信用卡。如何在sql中屏蔽信用卡?

我必须保留最后4位数,其余的应该变成X的。

我想出这个至今

BEGIN TRAN 
-- SQL update in batches of 10,000 
WHILE (2 > 1) 
    BEGIN 
    BEGIN TRANSACTION 
    UPDATE TOP (10000) tblMyTable 
    SET creditCardNumber = 'XXXXXX' + RIGHT(creditCardNumber, 4) 
    WHERE myDate < '2010-Feb-02' 

    IF @@ROWCOUNT = 0 
     BEGIN 
     COMMIT TRANSACTION 
     BREAK 
     END 
    COMMIT TRANSACTION 
    -- 1 second delay 
    WAITFOR DELAY '00:00:01' 
    END -- WHILE 
GO 
ROLLBACK 

与这虽然问题是有在数据库中有明显伪造的信用卡,甚至可能没有4个位数的记录。基本上我需要更新这是为了添加相同数量的X并保留最后4位数字。如果少于4位数字,则再添加一些X.

1242 would turn into XXXXXX1242 
12 would turn into XXXXXXXX12 
1234567890 would turn into XXXXXX7890 
+5

发送桌子给我,我很乐意帮助你:) – 2012-01-27 00:14:29

+0

@MikeChristensen哈哈。我想我们可以找到很多免费的俄罗斯网站! – Bohemian 2012-01-27 00:18:12

+0

想知道你是否可以使用子串并实现它。例如创建最大数量的'xxxx'字符串。并使用长度和子字符串添加到rihgt(creditcardnumber,4)。你怎么看? – AJP 2012-01-27 00:23:58

回答

2
Declare @xx VARCHAR(20) 
DECLARE @length INT 

SET @length = 17 
SET @xx = 'XXXXXXXXXXXXXXXX' 

UPDATE TOP (10000) tblMyTable 
    SET creditCardNumber = SUBSTRING(@xx, 0, @length - len(RIGHT(creditCardNumber, 4))) + RIGHT(creditCardNumber, 4) 
    WHERE myDate < '2010-Feb-02' 

看看是否能解决这个问题。

3

如果唯一的问题是一些数字是小于4个字符,左板呢?

看到Most efficient T-SQL way to pad a varchar on the left to a certain length?

为的解释

权( 'XXXXXXXXXXXX' + @str,@n)

是如何工作的。

+0

我认为这将是我唯一的问题。我仍然不确定它是否处于无终止循环。我跑了它,似乎超过了我被告知会有的行数。我实际上不确定IF如何获得令人满意的退出循环。 – chobo2 2012-01-27 16:56:52

1
select 
    stuff(account_no,1,len(account_no)-4,REPLICATE('X', LEN(account_no)-4)), 
    account_no, 
    stuff(routing_no,1,len(routing_no)-3,REPLICATE('X', LEN(routing_no)-3)), 
    routing_no 
from dbo.PAYER_BANK_DETAIL