내가 재귀 CTE로하고위한 솔루션을 가지고 XML 경로 :
,
DECLARE @n int = 4 --Add 4 for each ASCII
--Here I simulate your table, hope you have ids in it
-- because I used to join it with values
;WITH YourTable AS (
SELECT CAST(SomeString as nvarchar(max)) as SomeString
FROM (VALUES ('ABCD'),('1234'),('A1B2'),('WXYZ')
) as t(SomeString)
), cte AS (--Here we replace chars
SELECT CHAR(ASCII(SUBSTRING(SomeString,1,1))[email protected]) as d,
1 as [level],
LEN(SomeString) as l,
SomeString as OrigString
FROM YourTable
UNION ALL
SELECT CHAR(ASCII(SUBSTRING(OrigString,[level]+1,1))[email protected]),
[level]+1,
l,
OrigString
FROM cte
WHERE l >= [level]+1)
--Final output
SELECT DISTINCT c.OrigString,
(SELECT d+''
FROM cte
WHERE c.OrigString = OrigString
FOR XML PATH('')
) as NewString
FROM cte c
OPTION (MAXRECURSION 0)
출력 :
OrigString NewString
1234 5678
A1B2 E5F6
ABCD EFGH
WXYZ [\]^
EDIT VARBINARY (MAX)와
해결 변환 :
DECLARE @x xml,
@n int = 4 --Add 4 for each ASCII
--Here I simulate your table, hope you have ids in it
-- because I used to join it with values
;WITH YourTable AS (
SELECT CAST(SomeString as nvarchar(max)) as SomeString
FROM (VALUES ('ABCD'),('1234'),('A1B2'),('WXYZ')
) as t(SomeString)
)
SELECT @x = (
SELECT CAST('<row str="'+SomeString+'"><p>'+REPLACE(REPLACE(CONVERT(nvarchar(max),CONVERT(VARBINARY(MAX),SomeString),1),'0x',''),'00','</p><p>')+'</p></row>' as xml)
FROM YourTable
FOR XML PATH('')
)
;WITH cte AS(
SELECT t.c.value('../@str','nvarchar(max)') as OrigString,
CHAR(CAST(CONVERT(VARBINARY(2),'0x'+t.c.value('.','nvarchar(2)'),1) as int)[email protected]) as NewValues
FROM @x.nodes('/row/p') as t(c)
)
SELECT DISTINCT
c.OrigString,
LEFT((
SELECT NewValues +''
FROM cte
WHERE OrigString = c.OrigString
FOR XML PATH('')
),LEN(c.OrigString)) as NewString
FROM cte c
동일한 출력.
는 Z''어떻게됩니까? –
당신은 문자 단위로 문자열을 통과하는 함수를 작성할 수 있습니다. 그리고 말하자면, 그 문자의 ascii 값을 4 씩 증가시킬 수 있습니다 만, SQL에서 이것을 수행하는 쉬운 방법은 없다고 생각합니다. – ZLK
'W', 'X', 'Y', 'Z', '6', '7', '8', '9'의 장면은 무엇입니까? – Wanderer