2013-05-02 3 views
0

EMR 데이터베이스에서 감사 로그를 검색하도록 쿼리를 설계하려고합니다. 문제는 감사 정보가 varchar 열에 저장된다는 것인데, 어떤 일이 일어 났는지 (내가 신경 쓰지 않는)와 유효한 XML이 포함 된 다른 시간에 대한 텍스트 설명 일 수도 있습니다 (이것이 설계상의 결함이라는 것을 알고 있지만varchar를 XML로 변환하고 XML을 구문 분석하지 못함

테이블 값 함수를 만들었는데 XML을 파싱하고 데이터를 반환하지만 함수의 XML 변환이 실패하기 때문에 select 문이 실행되지 않는 경우가 있습니다. try/catch 함수에서 변환을 수행 할 수 없습니다 및 try/catch 중 하나를 사용하여 변환 할 함수에서 저장 프로 시저를 호출 할 수 있습니다 그래서 어디로 갈지 잘 모르겠습니다.

선택 상위 1 * (NOLOCK)와 감사에서 외부

ERROR XML 파싱 세부로 dbo.cus_GetDeletedAttachmentInfo (Audit.Audituid)를 적용 : 라인 1, 문자 (136), 불법 XML 문자

+0

이 MS SQL 서버입니다 : 일반적으로 여기에 같은 마크 업에 대한 목록 (이 이러한 모든 시도하지 않은 그냥 예입니다)이 있습니까? 어떤 버전입니까? – EkoostikMartin

+0

MS SQL Server 2012 – Kynrek

답변

1

당신에게 마크 업에 불법 문자가있는 경우 xml로 변환하려고 할 때 잠깐 잡을 필요가 있습니다. 오류가있는 이유 당신은 캐스트의 다른 기본 동작을 표시 또는 실패 상태입니다 SQL 서버에서 변환되지 않습니다 앰퍼샌드 및 다른 문자 같은 것들을 고려해야

declare @Text varchar(max); 

select @Text = '<root><stuff>&</stuff></root>' 


begin try 
    select Cast(@Text as xml) 
end try 
begin catch 
    Select Error_message() 

    Select 'Let''s account for ampersand manually by converting' 

    select cast(replace(@Text, '&', '&amp;') as xml) 
end catch 

:이 같은 짓을 . XML은 특수 문자를 마크 업해야합니다.

http://rabbit.eng.miami.edu/info/htmlchars.html

+0

잘못된 문자가 없거나 유효한 XML이 아닐 수도 있습니다. 아직도 변환은 올바른 방향으로 나아가는 단계입니다. +1 – Paparazzi

+0

이제 다른 오류 XML 파싱이 발생합니다. 줄 1, 문자 39, 인코딩을 전환 할 수 없습니다. – Kynrek

+0

많은 잠재적 인 잘못된 문자를 고려하여 데이터가 유효한 XML인지 확인해야합니다. 내 예제는 일반적으로 누군가가 문자열 필드에 앰퍼샌드를 넣는 가장 일반적인 예입니다. 당신은 언제나 varchar 필드를 게시 할 수 있고 우리는 그렇게 해낼 수 있습니다. try/catch 블록에서 많은 대체 옵션을 시도하는 변환을 수행하는 절차를 작성합니다. 때로는 Blam이 위에서 설명한 바와 같이 실제로 잘못된 xml을가집니다. 그것은 누군가가 유효성 검사기 주위에 텍스트를 넣지 않으면 문제가됩니다. 합법적 인 XML이 될 필요가 없습니다. – djangojazz

관련 문제