Вы можете сделать это довольно легко с помощью таблицы подсчета. Я держу один в моей базе данных. Вот код для моей таблицы. Самое большое преимущество, которое имеет здесь таблица подсчета, состоит в том, что нам не нужно делать никаких циклов !!!
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
Теперь, когда у нас есть таблица подсчета, мы можем использовать ее для сдвига вашего персонажа. Это будет работать практически с любой строкой (пока вы не достигнете верхнего конца значений ASCII).
declare @Val varchar(10) = 'Durgesh'
select stuff((
select char(ASCII(substring(@Val, t.N, 1)) + 2)
from cteTally t
where t.N <= len(@Val)
order by t.N
FOR XML PATH('')), 1, 0, '')
- EDIT -
Вот новая версия, которая будет "переносить" символы возвращаются к началу.
declare @Val varchar(100) = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
select stuff((
select case when (ASCII(substring(@Val, t.N, 1)) > 88 AND ASCII(substring(@Val, t.N, 1)) < 91) --Upper case
OR ASCII(substring(@Val, t.N, 1)) > 120 --lower case
then char(ASCII(substring(@Val, t.N, 1)) - 24) else char(ASCII(substring(@Val, t.N, 1)) + 2) end
from cteTally t
where t.N <= len(@Val)
order by t.N
FOR XML PATH('')), 1, 0, '')