2011-01-03 2 views
1

SQL Server 2005에서 일부 CML 구문을 빌려 쓰겠습니다. 이렇게하기 위해 모든 값을 varchar로 변경합니다. 문제는 내가이 값들을 USE로 만들고 싶을 때 10 진수로 변환해야 할 때 발생한다.'null'varchar를 십진수로 변환

그래서, 내 XML 코드는 다음과 같습니다 : VAL가 null의 경우

set @result = @result + <VAL>' + coalesce(cast(@val as varchar(20)), '-.11111') + '</VAL>' 

이 방법은, 내가 특별한 소수를 반환하고 그 진수를 확인할 수 있습니다. 성능 때문에

case when cast(InvestmentReturn.fn_getSTRUCT(...args...).value('results[1]/VAL[1]', 'varchar(40)')as decimal(10,5)) = -.11111 

:이 일의 단점은, 내가 값을 사용할 때 내가, 내가이 같은 0 에 값이 동일 변환 있는지 확인해야 다른 쪽 끝 유착을 사용할 수 없다는 것입니다 이제는 성능을 향상시킬 수있는 방법 중 하나가 중첩 된 case 문을 사용하고 내 특별 'null'과 동등한 값을 검사하는 대신 병합을 사용하는 것일 수 있다고 생각했습니다.

의견이 있으십니까?

또한, 나는 선택 캐스트 (십진수로 '널 (null)이'(10,5)가) 나에게주는 것을 볼 수 :

Msg 8114, Level 16, State 5, Line 1 
Error converting data type varchar to numeric. 

답변

1

성능 문제는 여러 가지 요인에 의해 발생할 수 있습니다.

첫 번째 것은 SQL 2005에서 XML을 사용하고 있습니다. 사용중인 xml 데이터의 크기를 알지 못하지만 특정 크기의 장벽을 넘은 경우이 5 년 전에 시도했을 때 (나는 32k라고 생각합니다. 64k가되었을 수도 있습니다) 처리 성능이 절벽에서 떨어졌습니다. 1 여분의 바이트를 사용하면 쿼리가 500ms에서 60 초 사이가됩니다. 이 시점에서 SQL 서버가 XML 데이터를 처리하도록 포기해야했습니다. C#에서 그 처리를하는 것이 훨씬 빠릅니다.

두 번째 것은 select 문에서 함수를 호출합니다. 이 함수가 여러 행에서 작동해야하는 경우 성능이 저하됩니다. 이것을 설명하기 위해 항상 사용하는 한 가지 예는 GETDATE()입니다. 변수를 GETDATE()의 반환 값으로 설정 한 다음 해당 변수를 선택 쿼리에서 사용하면 쿼리 자체에서 GETDATE()를 호출하는 것보다 훨씬 빠르게 실행됩니다. 제공 한 작은 코드 예제는 함수를 호출하기 때문에 살인자가 될 수 있습니다.

이것은 당면한 문제에 대한 좋은 대답은 아니지만 실제로 SQL 서버에서 XML 처리 코드를 잡아내어 선택한 다른 언어로 처리하는 것이 훨씬 더 효과적이라고 생각합니다.

관련 문제