首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将'null‘varchar转换为decimal

将'null‘varchar转换为decimal
EN

Stack Overflow用户
提问于 2011-01-04 00:00:14
回答 1查看 1.8K关注 0票数 1

我需要在sql-server-2005中创建一些xml结构(借用C短语)。为此,我将所有值都更改为varchar。当我想要使用这些值时,问题就出现了,我必须将它们转换为十进制。

因此,我的xml代码如下所示:

代码语言:javascript
复制
set @result = @result + <VAL>' + coalesce(cast(@val as varchar(20)), '-.11111') + '</VAL>'

这样,如果VAL为null,我将返回一个特殊的小数,并且可以检查该小数。这样做的缺点是,当我使用值时,我不能在另一端使用coalesce,我必须检查它转换后的值是否等于0。如下所示:

代码语言:javascript
复制
case when cast(InvestmentReturn.fn_getSTRUCT(...args...).value('results[1]/VAL[1]', 'varchar(40)')as decimal(10,5)) = -.11111

由于性能现在是不可接受的,我认为提高性能的一种方法可能是使用coalesce,而不是使用嵌套的case语句,并检查值是否与我的特殊'null‘等效项相等。

有什么想法吗?

另外,我看到select cast('null‘表示decimal(10,5))给了我:

代码语言:javascript
复制
Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-04 00:09:05

性能问题可能由许多因素引起。

第一个是在SQL2005中使用XML。我不知道您正在使用的xml数据的大小,但是当我在5年前尝试这样做时,如果您跨越了某个大小的障碍(我认为是32k,可能是64k),那么处理性能就会跌落悬崖。1个额外的字节将导致查询从500ms到60秒。在这一点上,我们不得不放弃让SQL server自己处理XML数据。在C#中处理这个过程要快得多。

第二种方法是调用select语句中的函数。如果该函数必须对多行进行操作,那么性能就会下降。我经常用GETDATE()来说明这一点。如果您将一个变量设置为GETDATE()的返回值,然后在select查询中使用该变量,那么它的运行速度将比在查询本身中调用GETDATE()快一个数量级。您提供的小代码示例可能会成为一个杀手,因为它调用了一个函数。

这可能不能很好地解决您当前面临的问题,但我真的相信,将任何XML处理代码从SQL server中提取出来,并使用您选择的任何其他语言进行处理,效果会更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4585981

复制
相关文章

相似问题

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