我在一个旧的SQL2000数据库中有一个存储过程,它接受格式化为varchar的comment列,并将其导出为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对象的值?我是创建一个临时表并遍历每个项目,还是有更聪明的方法来做到这一点?我坚持使用遗留的SQL2000(版本6.0),因此不幸的是,无法使用任何较新的函数。
发布于 2009-08-04 00:09:11
检查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
)发布于 2011-05-30 15:14:55
很抱歉做了一个新的回答,评论就足够了,但我缺乏这样做所需的权限。关于你的问题的答案,我只想补充说,你应该谨慎使用上面的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_valuehttps://stackoverflow.com/questions/1225211
复制相似问题