字符串SQL SERVER中的掩码字符
如何在SQL SERVER中替换字符串中x和y字符之间的字符。字符串SQL SERVER中的掩码字符,sql,sql-server,Sql,Sql Server,如何在SQL SERVER中替换字符串中x和y字符之间的字符。 例如,如果我有:TEST123456在TE*******56结尾。我不知道字符串的长度,但我知道我需要在字符串中屏蔽x和y之间的字符 DECLARE @Str VARCHAR(20)='TEST123456', @x INT = 3, @Y INT = 9 SELECT MyString = @Str, Mask = STUFF(@Str,@x,@Y-@x,'********') 输出 MySt
例如,如果我有:TEST123456在TE*******56结尾。我不知道字符串的长度,但我知道我需要在字符串中屏蔽x和y之间的字符
DECLARE @Str VARCHAR(20)='TEST123456',
@x INT = 3,
@Y INT = 9
SELECT
MyString = @Str,
Mask = STUFF(@Str,@x,@Y-@x,'********')
输出
MyString Mask
TEST123456 TE********56
结合使用
STUFF
、REPLICATE
和CHARINDEX
DECLARE @string VARCHAR(20) = 'TEST123456'
DECLARE @maskStart CHAR = 'S'
DECLARE @maskEnd CHAR = '4'
SELECT
Original = @string,
MaskStartIndex = CHARINDEX(@maskStart, @string),
MaskEndIndex = CHARINDEX(@maskEnd, @string),
MaskToSet = REPLICATE('*', CHARINDEX(@maskEnd, @string) - CHARINDEX(@maskStart, @string)),
Replaced = STUFF(
@string,
CHARINDEX(@maskStart, @string),
CHARINDEX(@maskEnd, @string) - CHARINDEX(@maskStart, @string) + 1,
REPLICATE('*', CHARINDEX(@maskEnd, @string) - CHARINDEX(@maskStart, @string)))
WHERE
CHARINDEX(@maskStart, @string) > 0 AND
CHARINDEX(@maskEnd, @string) > CHARINDEX(@maskStart, @string)
CHARINDEX
将为您提供一个特定字符串在另一个字符串中的位置(默认情况下为第一个)
REPLICATE
将字符串重复N次,我们将其用于掩码
STUFF
将替换另一个字符串中的一个字符串(原始字符串中的掩码),同时在指定位置删除N个字符。您可以使用和作为:
当您说“我不知道字符串会有多长”时,
REPLICATE()
函数将根据您提供的@Start
和@End
返回星号“*”。我的要求与帖子不同,在这里发布我的解决方案,因为它可能会帮助其他人
CREATE FUNCTION [dbo].[uf_MaskText] (@cText VARCHAR(255), @iNumberOfVisibleCharacters INT)
RETURNS VARCHAR(255)
AS
BEGIN
IF ISNULL(@cText, '') <> ''
BEGIN
IF LEN(@cText) > @iNumberOfVisibleCharacters
BEGIN
DECLARE @iNumberCharacters INT = LEN(@cText)
SET @cText = REPLICATE('*', @iNumberCharacters - @iNumberOfVisibleCharacters) + SUBSTRING(@cText, @iNumberCharacters - @iNumberOfVisibleCharacters + 1, @iNumberOfVisibleCharacters)
END
END
RETURN @cText
END
GO
创建函数[dbo].[uf_MaskText](@cText VARCHAR(255),@iNumberOfVisibleCharacters INT)
返回VARCHAR(255)
作为
开始
如果为空(@cText,“”)
开始
如果LEN(@cText)>@iNumberOfVisibleCharacters
开始
声明@iNumberCharacters INT=LEN(@cText)
设置@cText=REPLICATE('*',@iNumberCharacters-@iNumberOfVisibleCharacters)+子字符串(@cText,@iNumberCharacters-@iNumberOfVisibleCharacters+1,@iNumberOfVisibleCharacters)
结束
结束
返回@cText
结束
去
您应该在应用程序中执行此操作。如果不希望SQL用户访问特定的表或数据库,则必须使用SQL角色和权限进行管理
CREATE FUNCTION [dbo].[uf_MaskText] (@cText VARCHAR(255), @iNumberOfVisibleCharacters INT)
RETURNS VARCHAR(255)
AS
BEGIN
IF ISNULL(@cText, '') <> ''
BEGIN
IF LEN(@cText) > @iNumberOfVisibleCharacters
BEGIN
DECLARE @iNumberCharacters INT = LEN(@cText)
SET @cText = REPLICATE('*', @iNumberCharacters - @iNumberOfVisibleCharacters) + SUBSTRING(@cText, @iNumberCharacters - @iNumberOfVisibleCharacters + 1, @iNumberOfVisibleCharacters)
END
END
RETURN @cText
END
GO