2012-01-27 2 views
1

Мне нужно сделать обновление на столе с более чем 1 миллионом записей для маскировки кредитных карт.Как замаскировать кредитную карту в 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

Отправьте мне стол, и я с радостью поможем вам: –

+0

@MikeChristensen LOL. Я думаю, мы сможем найти много русских сайтов, которые помогут бесплатно! – Bohemian

+0

Интересно, можете ли вы использовать подстроку и достичь этого. например, создать максимальное количество строк «xxxx». а использовать длину и подстроку добавить к rihgt (creditcardnumber, 4). что ты думаешь? – AJP

ответ

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

Если единственная проблема заключается в некоторые цифры менее четырех символов, левая подушка это?

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

для объяснения того, как

правый ('ХХХХХХХХХХХХ' + @str, @n)

работы.

+0

Я думаю, что это будет моя единственная проблема. Я все еще не уверен, что он находится в цикле без конца. Я запустил его, и мне показалось, что количество строк мне было сказано. Я на самом деле не знаю, как IF @@ ROWCOUNT = 0 получает удовлетворение, чтобы выйти из цикла. – chobo2

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 
Смежные вопросы