我需要在sql-server-2005中创建一些xml结构(借用C短语)。为此,我将所有值都更改为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‘表示decimal(10,5))给了我:
Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.发布于 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中提取出来,并使用您选择的任何其他语言进行处理,效果会更好。
https://stackoverflow.com/questions/4585981
复制相似问题