我如何在SQL 2000中使用TryParse?

Dil*_*e-O 1 t-sql parsing sql-server-2000

我在旧的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
       )
Run Code Online (Sandbox Code Playgroud)

但是,现在正在将数据插入到此列中,该列无法解析为money对象并导致该过程崩溃.我无法删除"坏"数据(因为这是第三方产品),但需要更新存储过程以测试可解析的钱条目并返回该条目.

如何更新此过程以便它只返回可解析为money对象的值?我是否创建了一个临时表并遍历每个项目,或者是否有更聪明的方法来执行此操作?我坚持使用旧版SQL 2000(版本6.0),因此不幸使用任何较新的功能.

Raj*_*ore 7

检查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
)
Run Code Online (Sandbox Code Playgroud)