Я должен преобразовать числовой код в буквенный код, например:
1234 -> ABCD
, где 0 = 0, 1 = A, 2 = b и т. Д.
Это моя функция и способ ее использования:
Create function dbo.DecodeNumToChar
(
@change varchar(10),
@foo varchar(10)
) returns varchar(10)
as
begin
DECLARE @II int = 1,
@result varchar(10)
;WITH x AS
(
SELECT @II as ii, STUFF(@foo,@II,1,SUBSTRING(@change,CAST(SUBSTRING(@foo,@II,1) AS INT)+1,1)) AS AA
UNION ALL
--SELECT @II+1
SELECT ii+1, STUFF(AA,ii+1,1,SUBSTRING(@change,CAST(SUBSTRING(@foo,ii+1,1) AS INT)+1,1)) AS AA
FROM x
where ii+1 <= LEN(@foo)
)
select top 1 @result = AA from x order by ii desc
return @result
end
--------------------------------------------
select brand_code, dbo.DecodeNumToChar('0ABCDEFGHI', brand_code)
from (VALUES('1234'),('5834'),('9905'),('0250')) as t(brand_code)
Эта функция работает хорошо, но в производственной БД у нас нет разрешения на создание функций.
I 'мы пытались преобразовать эту функцию в CTE, как это
declare @change varchar(9) = 'ABCDEFGHI'
DECLARE @II int = 0
;WITH x AS
(
SELECT TOP (10) n = ROW_NUMBER() OVER (ORDER BY Number)
FROM master.dbo.spt_values ORDER BY Number
),
innerCTE as
(
SELECT x.n, SUBSTRING(t.brand_code, x.n, 1) chnum,
case SUBSTRING(t.brand_code, x.n, 1)
when '0' then '0'
else char(65-1+SUBSTRING(t.brand_code, x.n, 1))
end chalfa, t.brand_code
FROM x INNER JOIN (VALUES('1234'),('5834'),('9905'),('0250')) as t(brand_code)
ON x.n <= LEN(t.brand_code)
),
CTE as
(
select n, chnum, chalfa, brand_code, stuff(brand_code, n, 1, chalfa) as code
from innerCTE
union all
select n+1, chnum, chalfa, brand_code, STUFF(code, n+1, 1, chalfa) as code
from cte
where n+1 <= LEN(cte.brand_code)
)
--select * from innerCTE
select * from CTE;
, или использовать CROSS APPLY, как в этом примере: Example_1
, или использовать CROSS APPLY с PIVOT, как в этом примере: Example_2
но мой опыт работы с SQL низок, и я не смог получить правильный результат.
Я хотел бы получить это:
brand_code decoded_code
1234 ABCD
5834 EHCD
9905 II0E
0250 0BE0
спасибо