代码之家  ›  专栏  ›  技术社区  ›  Dillie-O

如何在SQL 2000中进行胰蛋白酶分析?

  •  1
  • Dillie-O  · 技术社区  · 15 年前

    我在一个旧的SQL 2000数据库中有一个存储过程,它获取一个格式化为varchar的注释列,并将其导出为money对象。在设置此表结构时,假设这是进入此字段的唯一数据。当前过程的作用就是:

    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
           )
    

    但是,数据现在正被插入到这个列中,而这个列不能被money对象解析,并导致过程崩溃。我无法删除“坏”数据(因为这是第三方产品),但需要更新存储过程以测试money-parsable条目并返回该条目。

    如何更新此过程,使其只返回作为货币对象可分析的值?我是创建一个临时表并遍历每个项,还是有一种更聪明的方法来实现这一点?我一直坚持使用旧的SQL 2000(6.0版),所以很遗憾,使用任何更新的函数都不可用。

    2 回复  |  直到 13 年前
        1
  •  7
  •   Raj More    15 年前

    检查isNumeric可能会帮助您-您只需返回一个零值。如果要返回“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
    )
    
        2
  •  2
  •   Vince    13 年前

    很抱歉给出一个新的答案,这里的评论就足够了,但我缺乏这样做所需的权限。在回答你的问题时,我只想补充一点,你应该小心使用上面的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