1

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

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

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

这样,如果 VAL 为空,我返回一个特殊的小数,我可以检查那个小数。这样做的缺点是,当我使用该值时,我不能在另一端使用 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' as decimal(10,5)) 给了我:

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

1 回答 1

1

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

第一个是在 sql 2005 中使用 XML。我不知道您正在使用的 xml 数据的大小,但是当我在 5 年前尝试这个时,如果您越过了某个大小障碍(我认为它是 32k,可能是 64k ) 然后处理性能一落千丈。1 个额外的字节将导致查询从 500 毫秒变为 60 秒。那时我们不得不放弃让 SQL Server 自己处理 XML 数据。在 C# 中进行该处理要快得多。

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

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

于 2011-01-03T16:09:05.297 回答