0

文字列の文字を別の文字に置き換える 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

......
4

5 に答える 5

1

双方向で機能する別の方法は次のとおりです。

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

より多くの条件を実行している場合は、おそらくテーブル変数をマップとして使用します。小文字、ゼロ、ヌルなどの処理を追加することもできます。また、これを楽しみ以外の暗号として使用しないように注意します。

于 2012-07-26T14:45:21.187 に答える
0

私の答えは以下を参照してください!おかげさまで、これは私にとって本来よりも大変でした!

create function dbo.Translate(@Input varchar(1000))RETURNS VARCHAR(1000)BEGIN

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
于 2012-07-26T17:07:34.873 に答える
0

私はこれをテストしていませんが、上記のコードから続くでしょう。少なくとも、これを行う方法についてのアイデアが得られるはずです。

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
于 2012-07-26T13:58:03.947 に答える
0

これで始められるはずです...

-- 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
于 2012-07-26T13:36:50.150 に答える
0

コンバージョンを再確認してください。

C->P を変換し、後で置換すると P->C として更新されます。

各置換は、最も内側の呼び出しから順番に行われます。これらを関数に分割し、最初に何かに一致したら返す必要があります。

于 2012-07-26T13:35:13.103 に答える