首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >How do I TryParse in SQL2000?

How do I TryParse in SQL2000?
EN

Stack Overflow用户
提问于 2009-08-04 00:06:50
回答 2查看 6K关注 0票数 1

我在一个旧的SQL2000数据库中有一个存储过程,它接受格式化为varchar的comment列,并将其导出为money对象。在设置此表结构时,假定这将是进入此字段的唯一数据。当前过程的功能简单如下:

代码语言:javascript
复制
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对象的值?我是创建一个临时表并遍历每个项目,还是有更聪明的方法来做到这一点?我坚持使用遗留的SQL2000(版本6.0),因此不幸的是,无法使用任何较新的函数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-04 00:09:11

检查IsNumeric可能会对您有所帮助-您可以简单地返回一个零值。如果要返回“N/a”或其他字符串值

我用您的查询中的列创建了下面的示例。

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

第二个查询返回一个货币值。

第三个函数返回一个字符串值,其中N/A代替了非整数值。

代码语言:javascript
复制
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
)
票数 7
EN

Stack Overflow用户

发布于 2011-05-30 15:14:55

很抱歉做了一个新的回答,评论就足够了,但我缺乏这样做所需的权限。关于你的问题的答案,我只想补充说,你应该谨慎使用上面的ISNUMERIC。虽然它的工作与预期的一样,但它也将像'1.3E-2‘这样的东西解析为数值,奇怪的是,您无法在不生成异常的情况下将其转换为数值或货币。我通常最终会使用:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1225211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档