2009-08-04 4 views
1

varchar로 서식이 지정된 주석 열을 가져와 money 개체로 내 보냅니다. 이전 SQL 2000 데이터베이스에 저장 프로 시저가 있습니다. 이 테이블 구조가 설정되었을 때, 이것이이 필드에 들어가는 유일한 데이터라고 가정되었습니다. 현재 프로 시저 기능이 단순히이 :TryParse는 SQL 2000에서 어떻게합니까?

SELECT CAST(dbo.member_category_assign.coment AS money) 
    FROM dbo.member_category_assign 
WHERE member_id = @intMemberId 
     AND 
     dbo.member_category_assign.eff_date <= @dtmEndDate 
     AND 
     (
     dbo.member_category_assign.term_date >= @dtmBeginDate 
     OR 
     dbo.member_category_assign.term_date Is Null 
     ) 

그러나, 데이터는 이제 돈 객체 파싱되지 않고, 절차는 충돌을 일으키는 열이 삽입되고있다. "제 3 자 제품이므로" "불량"데이터를 제거 할 수는 없지만 저장 프로 시저를 업데이트하여 비용이 많이 드는 항목을 테스트하고이를 반환해야합니다.

돈 개체로 구문 분석 할 수있는 값만 반환하도록이 절차를 어떻게 업데이트 할 수 있습니까? 임시 테이블을 만들고 모든 항목을 반복합니까? 아니면이를 수행하는 더 영리한 방법이 있습니까? 난 레거시 SQL 2000 (버전 6.0)에 붙어있어 불행히도 새로운 기능을 사용할 수 없다.

답변

7

IsNumeric을 확인하면 도움이 될 수 있습니다. 단순히 0 값을 반환 할 수 있습니다. 'N/a'또는 기타 문자열 값을 반환하려는 경우

아래 예제를 쿼리의 열과 함께 만들었습니다.

첫 번째 쿼리는 모든 행을 반환합니다.

두 번째 쿼리는 MONEY 값을 반환합니다.

세 번째 것은 정수가 아닌 값 대신 N/A가 포함 된 문자열 값을 반환합니다.

set nocount on 
drop table #MoneyTest 
create table #MoneyTest 
(
    MoneyTestId Int Identity (1, 1), 
    coment varchar (100), 
    member_id int, 
    eff_date datetime, 
    term_date datetime 
) 
insert into #MoneyTest (coment, member_id, eff_date, term_date) 
values 
    (104, 1, '1/1/2008', '1/1/2009'), 
    (200, 1, '1/1/2008', '1/1/2009'), 
    (322, 1, '1/1/2008', '1/1/2009'), 
    (120, 1, '1/1/2008', '1/1/2009') 

insert into #MoneyTest (coment, member_id, eff_date, term_date) 
values ('XX', 1, '1/1/2008', '1/1/2009') 

Select * 
FROM #MoneyTest 

declare @intMemberId int = 1 
declare @dtmBeginDate DateTime = '1/1/2008' 
declare @dtmEndDate DateTime = '1/1/2009' 

SELECT 
    CASE WHEN ISNUMERIC (Coment)=1 THEN CAST(#MoneyTest.coment AS money) ELSE cast (0 as money) END MoneyValue 
FROM #MoneyTest 
WHERE member_id = @intMemberId 
AND #MoneyTest.eff_date <= @dtmEndDate 
AND 
(
    #MoneyTest.term_date >= @dtmBeginDate 
    OR 
    #MoneyTest.term_date Is Null 
) 

SELECT 
    CASE WHEN ISNUMERIC (Coment)=1 THEN CAST (CAST(#MoneyTest.coment AS money) AS VARCHAR) ELSE 'N/a' END StringValue 
FROM #MoneyTest 
WHERE member_id = @intMemberId 
AND #MoneyTest.eff_date <= @dtmEndDate 
AND 
(
    #MoneyTest.term_date >= @dtmBeginDate 
    OR 
    #MoneyTest.term_date Is Null 
) 
+0

Beautiful! 매력처럼 일했습니다! 정말 고마워! –

2

새로운 답변을 작성하는 것에 대해 사과드립니다. 주석이 충분할 수 있지만 필요한 권한이 부족합니다. 귀하의 질문에 대한 답변에 나는 위의 ISNUMERIC을 신중하게 사용해야한다고 덧붙이고 싶습니다. 예상대로 작동하지만 '1.3E-2'와 같은 값을 숫자로 파싱합니다. 이상하게도 예외를 생성하지 않고도 숫자 나 금액으로 변환 할 수 없습니다. 일반적으로 다음과 같이 사용합니다.

SELECT 
    CASE WHEN ISNUMERIC(some_value) = 1 AND CHARINDEX('E', Upper(some_value)) = 0 
     THEN Cast(some_value as money) 
     ELSE Cast(0 as money) 
    END as money_value 
관련 문제