문제

이 코드는 기본적으로 한 문자열의 위치에 따라 문자를 다른 문자열의 동일한 위치에서 문자로 변환하고 테이블의 모든 행에 대해 실행됩니다.

이것을 실행할 때 (단순화 된 버전) :

DECLARE @R           char(40)
DECLARE @U           char(40)
SET @R=' abcdefghijklmnopqrstuvwxyz!@#$%^&*()_+'+char(181)
SET @U=REVERSE(@R)

DECLARE @TestTable TABLE (RowID int identity(1,1) primary key, Unreadable  varchar(500))
INSERT INTO @TestTable VALUES ('+µt$zw!*µsu+yt!+s$xy')
INSERT INTO @TestTable VALUES ('%*!!xµpxu!(')
INSERT INTO @TestTable VALUES ('pxpµnxrµu+yµs%$t')


    ;WITH CodeValues AS
    (
    SELECT
        Number,SUBSTRING(@R,Number,1) AS R,ASCII(SUBSTRING(@U,Number,1)) AS UA
        FROM Numbers
        WHERE Number<=LEN(@R)
    )
    SELECT
        t.RowID
            ,(SELECT
                  ''+c.R
                  FROM Numbers               n
                      INNER JOIN CodeValues  c ON ASCII(SUBSTRING(t.Unreadable,n.Number,1))=c.UA
                  WHERE n.Number<=LEN(t.Unreadable) 
                  FOR XML PATH('') 
             ) AS readable
        FROM @TestTable t

나는 다음을 얻는다 :

RowID       readable
----------- ---------------------------------------
1           a&#x20;simple&#x20;translation
2           hello&#x20;world
3           wow&#x20;you&#x20;ran&#x20;this

그러나 필요 :

RowID       readable
----------- ---------------------------------------
1           a simple translation
2           hello world
3           wow you ran this

다른 방법이 있습니까? REPLACE(), 공간이 제대로 나타나려면? 이것은 내 실제 코드에서 라인 브레이크에서도 발생합니다.

더 나은 방법으로 다시 작성할 수 있습니까? 나는 기본적으로 방금 사용했습니다 FOR XML PATH('') 개별 행 값을 함께 연결하기 위해.

도움이 되었습니까?

해결책

당신이 얻는 XML이 정확합니다. 그것은이다 XML, 텍스트가 아니며 XML 파서가 XML로 읽을 수 있습니다. 특수 캐릭터는 제대로 탈출해야합니다. XML이 텍스트가 아닌 XML로 구문 분석 해야하는 클라이언트 모듈을 소비 한 다음 올바르게 표시됩니다.

업데이트:

명확하지 않은 경우 쿼리에서해야 할 일은 XML로 XML로 취급하고 XML을 텍스트로 혼합하지 않고 텍스트로 취급하는 것입니다.

;WITH CodeValues AS
    (
    SELECT
        Number,SUBSTRING(@R,Number,1) AS R,ASCII(SUBSTRING(@U,Number,1)) AS UA
        FROM Numbers
        WHERE Number<=LEN(@R)
    )
, XmlValues AS (
SELECT
        t.RowID
            ,(SELECT
                  ''+c.R
                  FROM Numbers               n
                      INNER JOIN CodeValues  c ON ASCII(SUBSTRING(t.Unreadable,n.Number,1))=c.UA
                  WHERE n.Number<=LEN(t.Unreadable) 
                  FOR XML PATH(''), TYPE
             ) AS readable
        FROM @TestTable t)
SELECT x.RowId,
    x.readable.value('.', 'VARCHAR(8000)') as readable
    FROM XmlValues AS x
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top