2009-08-04 40 views
1

我在一箇舊的SQL 2000數據庫中有一個存儲過程,它將一個格式化爲varchar的註釋列作爲一個貨幣對象導出。在建立這個表格結構時,人們認爲這將是唯一進入該領域的數據。目前的程序功能簡單,就是這樣的:如何在SQL 2000中TryParse?

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'或其他字符串值

我使用查詢中的列創建了下面的示例。

第一個查詢只是返回所有行。

第二個查詢返回一個MONEY值。

第三個用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

美麗!像魅力一樣工作!非常感謝! – 2009-08-04 15:59:26

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