将'null'varchar转换为decimal

时间:2011-01-03 16:00:14

标签: sql-server-2005 performance coalesce

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

所以,我的xml代码如下所示:

set @result = @result + <VAL>' + coalesce(cast(@val as varchar(20)), '-.11111') + '</VAL>'

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

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'为十进制(10,5))给了我:

Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.

1 个答案:

答案 0 :(得分:1)

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

第一个是在sql 2005中使用XML。我不知道你正在使用的xml数据的大小,但是当我5年前尝试过这个时,如果你超过了一定的大小障碍(我认为它是32k,可能已经64k)然后处理性能从悬崖上掉下来。 1个额外字节会导致查询从500毫秒变为60秒。我们不得不放弃让SQL服务器自己处理XML数据。在C#中进行处理的速度要快得多。

第二个是调用select语句中的函数。如果该函数必须在多行上运行,那么性能就会下降。我总是用来说明这一点的一个例子是GETDATE()。如果将变量设置为GETDATE()的返回值,然后在select查询中使用该变量,则它将比在查询本身中调用GETDATE()快一个数量级。你提供的小代码示例可能只是一个杀手,因为它正在调用一个函数。

对于您当前的问题,这可能不是一个好的答案,但我真的相信您可以更好地服务于SQL服务器中的任何XML处理代码并使用您选择的任何其他语言进行操作。