我有一個Sql Server 2K8 R2數據庫,其表的列有一個包含以(char 13和char 10)分隔的倍數值的列。使用T-SQL將值拆分爲多行時遇到的問題
我正在構建一個腳本來將數據導入正確的規範化模式。
我的源表包含這樣的事情:
ID | Value
________________
1 | line 1
line 2
________________
2 | line 3
________________
3 | line 4
line 5
line 6
________________
等。
[編輯]僅供參考,編號爲整數,值類型爲nvarchar(3072)[/編輯]
我要的是查詢表輸出中somethnig這樣的:
ID | Value
________________
1 | line 1
________________
1 | line 2
________________
2 | line 3
________________
3 | line 4
________________
3 | line 5
________________
3 | line 6
________________
我已經閱讀了很多關於SO的答案,並且也在網絡上發現了很多,我發現使用master..sptvalues
應該是解決方案。特別是,我試圖重現問題Split one column into multiple rows的解決方案。 然而,沒有成功(懷疑有兩個字符導致問題)。
到現在爲止,我寫了這個查詢:
SELECT
T.ID,
T.Value,
RIGHT(LEFT(T.Value,spt.Number-1),
CHARINDEX(char(13)+char(10),REVERSE(LEFT(char(13)+char(10)+T.Value,spt.Number-1)))) as Extracted
FROM
master..spt_values spt,
ContactsNew T
WHERE
Type = 'P' AND
spt.Number BETWEEN 1 AND LEN(T.Value)+1
AND
(SUBSTRING(T.Value,spt.Number,2) = char(13)+char(10) OR SUBSTRING(T.Value,spt.Number,2) = '')
這個查詢,不幸在返回:
ID | Value | Extracted
________________________________
1 | line 1 | <blank>
line 2 |
________________________________
1 | line 1 | line 2
line 2 |
________________________________
2 | line 3 | <blank>
________________________________
3 | line 4 | <blank>
line 5 |
line 6 |
________________________________
3 | line 4 | line 5
line 5 | line 6
line 6 |
________________________________
3 | line 4 | line 6
line 5 |
line 6 |
________________________________
<blank>
是一個空字符串,而不是空字符串。
我希望得到一些幫助來調整我的查詢。
[EDIT2]我的源表包含小於200條記錄,和性能不是必需的,所以我靶向簡單的解決方案,而不是一個有效的一個[EDIT2]
[EDIT3 ]源數據庫是隻讀的。我無法添加存儲過程,函數或clr類型。我必須在單個查詢中執行此操作。 [EDIT3]
[Edit4]奇怪的事情...看來,空格也被視爲分隔符。
如果我運行下面的查詢:
SELECT
T.ID,
replace(T.Value, '#', ' '),
replace(RIGHT(
LEFT(T.Value,spt.Number-1),
CHARINDEX(char(13) + char(10),REVERSE(LEFT(char(10) + char(13)+T.Value,spt.Number-0)))
), '#', ' ')
FROM
master..spt_values spt,
(
select contactID,
replace(Value,' ', '#') Value
from ContactsNew where Value is not null
) T
WHERE
Type = 'P' AND
spt.Number BETWEEN 1 AND LEN(T.Value)+1
AND
(SUBSTRING(T.Value,spt.Number,2) = char(13) + char(10) OR SUBSTRING(T.Value,spt.Number,1) = '')
我得到的回報(但是,仍然有錯誤的價值觀)的正確數量,同時運行該查詢:上空間也
SELECT
T.ID,
T.Value,
RIGHT(
LEFT(T.Value,spt.Number-1),
CHARINDEX(char(13) + char(10),REVERSE(LEFT(char(10) + char(13)+T.Value,spt.Number-0)))
)
FROM
master..spt_values spt,
(
select contactID,
Value
from ContactsNew where Value is not null
) T
WHERE
Type = 'P' AND
spt.Number BETWEEN 1 AND LEN(T.Value)+1
AND
(SUBSTRING(T.Value,spt.Number,2) = char(13) + char(10) OR SUBSTRING(T.Value,spt.Number,1) = '')
分裂
不幸的是,我不能將函數添加到源數據庫(生產服務器)。我必須能夠在單個SQL查詢中執行此操作。 –
@SteveB,好的,我修改了我的答案。 –
請注意,如果字符串是列的全長,那麼這將不起作用 - 「spt_values」中只有2048個'type ='P''值(列爲3072) –