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),因此不幸使用任何较新的功能.
检查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)