2

XML을 통해 고유 식별자 목록을받는 저장 프로 시저가 있습니다. 하나 이상의 문자열이 유효한 고유 식별자가 아닐 가능성이 있습니다. 이 변환시 SQLServer에서 예외가 발생하고 전체 프로 시저가 중단됩니다.문자열을 고유 식별자로 변환 할 때 오류를 방지하지 않습니다.

이러한 오류를 억제하고 계속할 수 있습니까? 하나의 ID를 제외한 모든 ID가 유효하면 하나의 ID가 구문 분석에 실패했음을 나타내는 오류 메시지가 아닌 유효한 ID에 대한 모든 데이터를 원합니다.

관련 선택 :

SELECT * 
FROM dbo.Daily dd   
    INNER JOIN dbo.Member m ON m.MemberId = dd.MemberID 
    INNER JOIN OPENXML(@hdoc, 'list_of_guids/id/text()', 1) with (guid uniqueidentifier '.') x 
      ON x.guid = m.MemberGuid 

샘플 XML, 마지막 항목이 유효 참고 :

<list_of_guids> 
<guid>7B8CFAED-8C59-431D-9447-2A45BD4612E5</guid> 
<guid>537F4129-0732-4D29-B3B8-4B9127F8522F</guid> 
<guid>9965395A-676F-48F2-91CC-F46527D134C</guid> 
</list_of_guids> 

하나의 가능성은 VARCHAR가 아닌 다른 방법으로 주위에 uniqueidentifiers를 변환하는 것입니다 그러나 uniqueidentifier는 구성원 테이블의 인덱스이므로 성능에 영향을 줄 수 있습니다.

+0

슬프게도 ISNUMERIC()과 ISDATE()를 보완하는 ISUNIQUEIDENTIFIER()가 없습니다. SQL Server 2012에서는 하위 테이블에 마지막 테이블 구조체를 래핑하고 TRY_CONVERT()를 사용할 수 있습니다. 최신 XML 방법 중 하나를 사용 해본 적이 있습니까? 솔직히 말해 OPENXML이 여전히 효과가 있다는 것에 놀랐습니다. :-) –

답변

1

오픈 XML을 읽는 것은 내부에있는 데이터 유형에 관계없이 성능을 변경하지 않습니다. 이 (주로 의사) 같은 일을 간주 적이 :

SELECT * FROM OPENXML ... INTO #tmp; -- using VARCHAR type, not GUID 

DELETE #tmp WHERE col NOT LIKE '[0-9A-F]...' -- delete those not matching pattern 
    OR col IS NULL; 

ALTER TABLE #tmp ALTER COLUMN col UNIQUEIDENTIFER; 
-- create index here too maybe 

SELECT FROM #tmp JOIN other tables; 

내가 제안한 것처럼은 SQL Server 2012에 쉽게 그리고 나는 #temp 테이블에 해당 행을 작성 생각하지 않는다 전체를 바꿀 것입니다 큰 도움이 GUID 열의 인덱스 인 경우 그만큼의 성능.

+0

감사합니다.이 방법이 효과적입니다. 그러나 2008 년의 패턴 일치는 비참하게 보입니다. – DylanStreb

관련 문제