2017-09-29 152 views
1

我有一個記錄表,每個記錄都有一個唯一的標識符,一個開始日期和兩個分號分隔的字符串,我需要將每個日期的值分解爲一個值,第一個日期是每個記錄的開始日期值。由於循環不好,我應該如何完成我想要做的事情?

目前,我正在做各種不好的事情,因爲我使用While循環遍歷表中的每條記錄(16K記錄+),並且使用了使用While循環的分割函數。分割功能基於Oskar Austegard的dbo.fnSplit功能。

我一直在閱讀有關如何使用循環拆分對性能不利,但這些分隔字符串最多有100個項目。我開始嘗試瞭解CROSS APPLY,並且我已經爲我創建的多個SP使用了CTE,但我不確定這裏使用CTE是否可行,或者它如何工作。我特別不確定在CROSS APPLY或任何其他APPLY。

如果有人願意協助,我會很樂意發佈我的查詢和摻假分裂功能。

+2

您可以特別分享一些示例數據以及您當前的代碼嗎? – Phylyp

+2

關於如何使用日期值拆分出分號分隔的字符串的更多細節,請參閱示例數據。 – Phylyp

+1

看看這篇文章。它需要很好的理解SQL,但也許你可以根據自己的目的進行修改。此外,顯示你的代碼總是有幫助! http://www.sqlservercentral.com/articles/Tally+Table/72993/ – Jeremy

回答

1

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

你被迫做壞事,因爲你違反了你的數據模型中的第一個正常形式(https://en.wikipedia.org/wiki/First_normal_form)。列不應該包含分隔列表,因爲數據不是原子的。通常應該將重複數據存儲爲單獨的行(可能位於具有一對多關係的不同表中),而不是同一行的列。

如果您修復模型以更緊密地遵守規範化原則,那麼您的查詢將變得更漂亮並且性能也更好。

0

循環不好。

我有一個表,每個記錄都有...兩個分號分隔的字符串...... [T]這些分隔的字符串最多有100個項目。

你知道什麼和循環一樣糟糕,可能更糟嗎?將分隔數據存儲在單列中。 不要這樣做!

而是向您的數據庫添加一個新表。此表將使用原始表格中的主鍵和分隔列中單個項目的空間。因此,如果原始表格中的一行在分隔列中有100個項目,那麼現在您在新表格中有一百行,每行都有來自原始表格的主鍵,並且只有另一列中的一個元素。

現在您可以使用簡單的JOIN來查詢每個項目。

相關問題