由于循环不好,我该如何完成我想做的事情?

时间:2017-09-29 16:32:32

标签: sql-server tsql while-loop split

我有一个包含记录的表,每个记录都有一个唯一的标识符,一个开始日期和两个分号分隔的字符串,我需要将这些字符串分解为每个日期的值,第一个日期是每个记录的开始日期值

目前,我正在做各种不好的事情,因为我使用While循环遍历表中的每条记录(16K记录+),我使用的是使用While循环的split函数。拆分功能基于Oskar Austegard的dbo.fnSplit功能。

我一直在阅读如何使用循环拆分对性能有害,但这些分隔的字符串最多有100个项目。我开始尝试了解CROSS APPLY并且我一直在为我创建的几个SP使用CTE,但我不确定在这里使用CTE是否有用或如何工作。我特别不确定CROSS APPLY或任何其他申请。

如果有人愿意帮忙,我会很乐意发布我的查询和掺假分割功能。

2 个答案:

答案 0 :(得分:1)

以下是this question on MSDN forums的答案。

你被迫做坏事,因为你违反了数据模型中的第一个普通形式(https://en.wikipedia.org/wiki/First_normal_form)。列不应包含分隔列表,因为数据不是原子的。另外,重复数据通常应存储为单独的行(可能在具有一对多关系的不同表中),而不是作为同一行的列。

如果您修复模型以更加严格地遵守规范化原则,那么您的查询将变得更加漂亮并且表现也会更好。

答案 1 :(得分:0)

  

循环不好。

  

我有一个记录表,每个记录都有...两个分号分隔的字符串... [T]这些分隔的字符串最多有100个项目。

你知道什么和循环一样糟糕,可能更糟吗?在单列中存储分隔数据。 不要这样做!

而是将新表添加到数据库中。此表将使用原始表中的主键和空格,用于分隔列中的单个项目。因此,如果原始表中的一行在分隔列中有100个项目,那么现在新表中有100行,每行都有原始表中的主键,而只有另一列中的一个元素。

现在,您可以使用简单JOIN的查询来识别每个项目。