Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符串SQL SERVER中的掩码字符_Sql_Sql Server - Fatal编程技术网

字符串SQL SERVER中的掩码字符

字符串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

如何在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,'********')
输出

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