Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
String 用于替换字符串中多个字符的SQL函数_String_Sql Server 2008_Replace_While Loop - Fatal编程技术网

String 用于替换字符串中多个字符的SQL函数

String 用于替换字符串中多个字符的SQL函数,string,sql-server-2008,replace,while-loop,String,Sql Server 2008,Replace,While Loop,我正在编写一个SQL Server 2008用户定义函数,用另一个字符替换字符串的字符。我认为下面的代码应该可以工作,但它不能。它似乎没有正确地更新@input的变量 你知道我该怎么解决这个问题吗 DECLARE @Input AS VarChar(1000) DECLARE @i AS TinyInt DECLARE @Substring AS VarChar(1000) DECLARE @Prestring AS VarChar(1000) DECLARE @Poststring

我正在编写一个SQL Server 2008用户定义函数,用另一个字符替换字符串的字符。我认为下面的代码应该可以工作,但它不能。它似乎没有正确地更新@input的变量

你知道我该怎么解决这个问题吗

 DECLARE @Input AS VarChar(1000)
 DECLARE @i AS TinyInt
 DECLARE @Substring AS VarChar(1000)
 DECLARE @Prestring  AS VarChar(1000)
 DECLARE @Poststring  AS VarChar(1000)

 Select @Input='ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789',
        @i = 1

 WHILE @i <= LEN(@Input) 
 BEGIN
    SELECT @Prestring = SUBSTRING(@Input,-1,@i)
    SELECT @Poststring = SUBSTRING(@Input,@i+1,LEN(@Input))    

    SELECT @Substring =  replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace
(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace
(SUBSTRING(@Input,@i,1), 'A', 'N'),'B', 'O'), 'C', 'P'), 'D', 'Q'), 'E', 'R'), 'F', 'S'), 'G', 'T'), 'H', 'U'), 'I', 'V'), 'J', 'W'), 'K', 'X'), 'L', 'Y'), 'M', 'Z'), 'N', 'A'), '0', 'B'), 'P', 'C')
, 'Q', 'D'),'R', 'E'),'S', 'E'),'T', 'E'),'U', 'F'),'V', 'G'),'W', 'H'),'X', 'I'),'Y', 'J'), '1', '9'),'2','8'),'3','7'),'4','6'),'5','5'),'6','4'),'7','3'),'8','2'),'9','1'),' ','')

    SELECT @Input = @Prestring + @Substring + @Poststring
    SELECT @i = @i + 1

    PRINT 'Prestring= ' + @Prestring PRINT 'SUBSTRING= ' + @Substring PRINT 'PostString= '     + @Poststring PRINT 'Total String: ' + @Prestring + ' + ' + @Substring + ' + ' + @Poststringenter code here

    PRINT 'END'

 END

Output:
Prestring= 
SUBSTRING= A
PostString= BCDEFGHIJKLMNOPQRSTUVWXYZ123456789
Total String:  + A + BCDEFGHIJKLMNOPQRSTUVWXYZ123456789
1
END

Prestring= A
SUBSTRING= O
PostString= CDEFGHIJKLMNOPQRSTUVWXYZ123456789
Total String: A + O + CDEFGHIJKLMNOPQRSTUVWXYZ123456789
2
END

Prestring= AO
SUBSTRING= C
PostString= DEFGHIJKLMNOPQRSTUVWXYZ123456789
Total String: AO + C + DEFGHIJKLMNOPQRSTUVWXYZ123456789
3
END

Prestring= AOC
SUBSTRING= D
PostString= EFGHIJKLMNOPQRSTUVWXYZ123456789
Total String: AOC + D + EFGHIJKLMNOPQRSTUVWXYZ123456789
4
END

......

重新检查您的转换

转换C->p,然后稍后的替换将其更新为p->C


每次替换都是从最里面的调用开始的。您应该将这些内容分解成一个函数,并在第一次匹配某个内容时返回。

这应该可以让您开始

-- A should return N
select dbo.ConvertChars('A');
-- B should return O
select dbo.ConvertChars('B');


--create function dbo.ConvertChars(@input char(1))
alter function dbo.ConvertChars(@input char(1))
returns char(1)
begin


    IF @input='A' return 'N';   
    IF @input='B' return 'O';


    return '';

end

我还没有测试过这个,但它将从上面的代码继续。它至少应该给你一个如何做到这一点的想法

create function dbo.ConvertCharString(@input varchar(1000))
returns varchar(1000)
begin
declare @id int
declare @len int
declare @c vhar(1)
declare @return varchar(1000)
        SET @idx = 0
        SELECT @idx = CHARINDEX(@delimiter, @str)
        SELECT @len = len(@input)

        -- loop through delimiter sep. list until no more comma's found i.e. charindex returns 0
        while  (@idx <= @len)
        begin
            set @c = substring(@input, @idx, 1)
            select @return = @return + dbo.ConvertChars(@c)
            select @idx = @idx-1
        end


end

下面是另一种双向工作的方法:

declare @input nvarchar(max) = N'ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'
    , @output nvarchar(max) = N''
    , @i int = 1

while @i <= len(@input) begin
    declare @unicode int = unicode(substring(@input, @i, 1))
    select @output = @output + nchar(
            case
                when @unicode between 65 and 77 then @unicode + 13
                when @unicode between 78 and 90 then @unicode - 13
                when @unicode between 49 and 57 then 106 - @unicode
                else @unicode
            end
        )
        , @i = @i + 1
end

select @input as VerySimpleCipher
union all
select @output

如果您要执行更多的条件,我可能会使用表变量作为映射。您可能需要添加对小写字母、零、空等的处理。此外,我要提醒您,不要将其用作除好玩以外的任何类型的密码。

请参阅下面的答案!多亏了大家,这比我本该做的还要难

创建函数dbo。Translate@Input瓦查尔1000 返回VARCHAR 1000 开始

DECLARE @i AS Int
Declare @SingleChar_Offset AS VarChar(1000)
Declare @Output AS VarChar(1000)
DECLARE @Unicode_Offset AS Int
DECLARE @UnicodeChar AS Int


SELECT @i = 1
Select @Output = ''


WHILE @i <= LEN(@Input) 
BEGIN
  Select @UnicodeChar = unicode(substring(@Input, @i, 1))

    IF @UnicodeChar <=52
      BEGIN
            Select @Unicode_Offset = @UnicodeChar+5
      END
  ELSE IF @UnicodeChar >52 AND @UnicodeChar <=57
      BEGIN
            Select @Unicode_Offset = @UnicodeChar-5
      END

  IF @UnicodeChar >= 65 AND @UnicodeChar <=77
      BEGIN
            Select @Unicode_Offset = @UnicodeChar+13
      END
  ELSE IF @UnicodeChar > 77
      BEGIN
            Select @Unicode_Offset = @UnicodeChar-13
      END

  Select @SingleChar_Offset = CHAR(@Unicode_Offset)
  SELECT @i = @i + 1   
  --PRINT @SingleChar_Offset
     Select @Output = @Output + @SingleChar_Offset
-- print 'END
-- '

END

--PRINT @Output

RETURN @Output

END

还有其他细节吗?数据库管理系统?症状?在旅程结束时,您期望@input的值是多少?现在它给了你什么?抱歉,SQL小姐。我可以发布我得到的输出,但在另一个运行SQL2008的系统上验证了它是相同的。您是如何得到如此难看的select@Substring语句的。我的建议是创建一个返回空字符串的函数,然后传入并修复函数中的代码以返回正确的值。对每个字符执行此操作。一旦您可以一次处理一个字符,您就可以担心处理多个字符。我希望NMNOPQRSTUVWXYZ987654321是的,谢谢,我以为我一次只看ta 1个字符就解决了这个问题,但我没有:谢谢Andrew,但这不是我遇到的问题——比如说我的字符串中有1个字符——a。我最终会像这样转换;A->N->A,结果是A!这更像是一个逻辑问题。如果你遵循我上面所做的,你将能够解决你在外部函数中提到的问题。i、 e.使用while循环一次处理每个字符,并在新字符串中生成结果我最终使用ASCII转换并调整其值,然后再转换回给我一个新字符。嘿,Andrew-它表现出相同的问题-a将被N替换,而N又被a替换。我尝试中断,但它们会杀死我的实际上,我想我看错了,我会试试这是个好方法!谢谢各位