2012-06-26 55 views
3

我們有一個包含大量數據的大型數據庫。我最近發現,我們的銷售和運輸部門一直在使用應用程序的一部分來公開客戶的信用卡號碼。我們已經制止了它,但現在有數千行的數字。查找並替換信用卡號碼

我們正在試圖弄清楚如何掃描某行中的16位數字(或劃線分隔)並用X代替它們。

這不是一個簡單的UPDATE語句,因爲卡號存儲在大量的文本中。到目前爲止,我一直無法弄清楚SQL Server是否可以使用正則表達式(它看起來不是)。

所有其他的失敗我會通過PHP來做到這一點,因爲這是我最擅長的......但它會很痛苦。

+2

這是應用程序代碼更容易設計處理的事情。你說得對,reg ex似乎是要走的路。你可以在C#中做到這一點,並把它放在一個CLR存儲過程中,這樣它可以很容易地從SSMS運行。可悲的是,因爲這是在一個文本字段中,您可能需要確定哪些記錄可能不好,然後讓某人手動檢查它們。畢竟一個零件號碼也可能以最合適的位數結束。我建議做錯誤的數據輸入的人是做手動檢查的人。 – HLGEM

+0

您也可以搜索短語信用卡,卡號,CCN作爲可能包含卡號的記錄的線索。 – HLGEM

+0

我同意HLGEM。另外,考慮在前端添加驗證,以防止未來發生這種情況。您不僅可以告訴用戶不要這樣做,您還可以嘗試檢測是否輸入了卡號,然後需要進行徽章掃描或來自主管的任何內容。這樣,稍後再次成爲問題的可能性就會降低。 –

回答

3

我想你最好編程這樣做,特別是因爲你所提到的數據可以在幾種不同的格式。請記住,並非所有信用卡號碼都是16位數字(Amex是15,Visa是13或16等)。

如果可能的話,檢查各種正則表達式和驗證代碼的功能可能最好在清理作業級別進行。

3

聽起來像你需要使用PATINDEX和WHERE LIKE子句。

就是這樣。用類似的東西創建一個存儲過程,然後用一系列不同的參數調用它(使@pattern變爲參數),直到你替換了所有的實例。

declare @pattern varchar(100), @patternlength int 
set @pattern = '[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' 
set @patternlength = 19 

update tableName 
set fieldName = 
    LEFT(fieldName, patindex('%'+ @pattern + '%', fieldName)-1) 
    + 'XXXX-XXXX-XXXX-XXXX' 
    + SUBSTRING(fieldName, PATINDEX('%'+ @pattern + '%', fieldName)[email protected], LEN(fieldName)) 
from tableName 
where fieldName like '%'+ @pattern + '%' 

訣竅只是找到合適的模式,並設置適當的@patternlength值(不@pattern的長度,這是行不通的!)

1

即興創作的肖恩的答案。

以下將在@text中查找@maskPattern的所有出現,並將其替換爲'x'。 例如,如果@maskPattern = XXXX-XXXX-XXXX-XXXX,它會在@text中找到此模式,並用XXXX-XXXX-XXXX-XXXX替換所有匹配項。如果它沒有發現任何事件,它將保持原樣。

此存儲過程也可以被操縱爲僅屏蔽maskPattern開頭的3/4。乾杯!

ALTER PROCEDURE [dbo].[SP_MaskCharacters] @text nvarchar(max), 
    @maskPattern nvarchar(500) 
    AS 
    BEGIN 
    DECLARE @numPattern nvarchar(max) = REPLACE(@maskPattern, 'x', '[0-9]') 
    DECLARE @patternLength int = LEN(@maskPattern) 
    WHILE (@text IS NOT NULL) 
    BEGIN 
    IF PATINDEX('%' + @numPattern + '%', @text) = 0 BREAK; 
    SET @text = 
    LEFT(@text, PATINDEX('%' + @numPattern + '%', @text)-1) --Get beginning chars of the input text until first occurance of pattern is found 
    + @maskPattern --Append aasking pattern 
    + SUBSTRING(@text, PATINDEX('%' + @numPattern + '%', @text) + @patternLength, LEN(@text)) -- Get & append rest of the text found after masking attern 
    END 
    SELECT @text 
END