2012-01-27 91 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