2009-08-04 5 views
1

私は古いSQL 2000データベースにvarcharとしてフォーマットされたコメント列を受け取り、それを金銭オブジェクトとしてエクスポートするストアドプロシージャを持っています。このテーブル構造がセットアップされた時点で、これがこのフィールドに入る唯一のデータであると仮定されました。現在の手順機能は、単にこの本:TryをTry 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 
     ) 

しかし、データは今お金オブジェクトに構文解析可能ではなく、クラッシュする手順を引き起こしてこの列に挿入されます。私は "悪い"データを削除することはできません(これはサードパーティ製品なので)。しかし、金銭的に分析可能なエントリをテストし、それを返すためにストアドプロシージャを更新する必要があります。

金銭オブジェクトとして解析可能な値のみを返すようにこのプロシージャを更新するにはどうすればよいですか?一時的なテーブルを作成し、すべてのアイテムを繰り返し処理するのですか、これを行うにはもっと巧妙な方法がありますか?私は残念なことに新しい機能のいずれかを使用することはできませんので、レガシSQL 2000(バージョン6.0)に立ち往生しています。

答えて

7

IsNumericを確認すると、ゼロ値を返すことができます。 'N/a'または他の文字列値を返す場合

私はあなたのクエリの列で以下のサンプルを作成しました。

最初のクエリはすべての行を返します。

2番目のクエリは、MONEY値を返します。

3番目の値は、整数以外の値の代わりにN/Aを含むString値を返します。

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

美しい!チャームのように働いた!本当にありがとう! –

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 
関連する問題