क्या आप जानते हैं कि कब तक डेटा के अपने क्षेत्र हो जाएगा, तो आप स्थिर संस्करण है कि अन्य जवाब का उत्पादन करेगा उपयोग कर सकते हैं, लेकिन आप हमेशा यह उत्पन्न करने के लिए एक समारोह बना सकते हैं:
CREATE FUNCTION MixUpCharacters
(
@OrigVal varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
DECLARE @NewVal varchar(max)
DECLARE @OrigLen int
DECLARE @LoopCt int
DECLARE @Part varchar(max) = ''
Declare @PartLength int
SET @NewVal = ''
SET @OrigLen = DATALENGTH(@OrigVal)
SET @LoopCt = 1
SET @Part = SUBSTRING(@OrigVal, 4, len(@OrigVal)-6)
set @PartLength = LEN(@Part)
WHILE @LoopCt <= @PartLength
BEGIN
-- Current length of possible characters
SET @NewVal = @NewVal + 'X'
-- Advance the loop
SET @LoopCt = @LoopCt + 1
END
Return REPLACE(@OrigVal, @Part, @NewVal)
END
इसके लिए फ़ंक्शन आप उन मानों में गुजरेंगे जिन्हें आप मास्क करना चाहते हैं।तो आपकी क्वेरी होगा:
declare @temp table
(
col1 varchar(50)
)
insert into @temp
values ('384844033434'), ('743423547878'), ('111224678885')
select dbo.MixUpCharacters(col1) col1
from @temp
देखें SQL Fiddle with Demo
परिणाम होगा:
;with data(col1) as
(
select '384844033434'
union all
select '7434235878'
union all
select '111224678885'
),
s1 (col1, repfull) as
(
select col1,
SUBSTRING(col1, 4, len(col1)-6) repfull
from data
),
s2 (col1, item, repfull, r) as
(
select col1,
cast('x' as varchar(max)),
right(repfull, LEN(repfull)-1),
repfull
from s1
union all
select col1,
'x'+ cast(item as varchar(max)),
right(repfull, LEN(repfull)-1),
r
from s2
where len(repfull) >0
)
select REPLACE(col1, r, item) newValue
from
(
select col1, item, R,
ROW_NUMBER() over(partition by col1 order by len(item) desc) rn
from s2
) src
where rn = 1
:
| COL1 |
----------------
| 384XXXXXX434 |
| 743XXXXXX878 |
| 111XXXXXX885 |
या यहाँ पुनरावर्ती CTE के साथ यह करने के लिए एक रास्ता है देखें SQL Fiddle with Demo
लग रहा है जैसे आप [चरित्र मास्किंग] के बारे में बात कर रहे हैं (http: //www.simple-talk।एन्क्रिप्शन –
हाँ के बजाय com/sql/डेटाबेस-प्रशासन/obfuscating-your-sql-server-data /) हाँ मास्किंग – pyram