我有一个旧的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版),所以使用任何新功能,遗憾的是无法使用。
检查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
)
道歉作出新的答案,其中一个评论就足够了,但我缺少所需的权限这样做。 到回答你的问题,我只想补充一点,你应该小心使用上述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