我如何在2000年SQL的TryParse?(How do I TryParse in SQL 20

2019-10-17 04:28发布

我有一个旧的SQL 2000数据库需要被格式化为一个varchar评论栏和出口它作为一个货币对象的存储过程。 当时这个表的结构是建立,假定这将是进入这一领域的唯一数据。 目前的程序功能简单,就是这样的:

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版),所以使用任何新功能,遗憾的是无法使用。

Answer 1:

检查IsNumeric函数可以帮助你 - 你可以简单地返回一个零值。 如果你想返回一个“N / A”或其他一些字符串值

我从你的查询创建下面的列样品。

第一个查询只返回所有行。

第二个查询返回物有所值。

第三个返回代替非整数值与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
)


Answer 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


文章来源: How do I TryParse in SQL 2000?