比方說,我有一個表,如分割字符串和列數
ItemID ClassID
------------------------
1 10, 13, 12
2 5, 7
,並希望將數據複製到另一個表像這樣
ItemID Numbering ClassID
----------------------------------
1 1 10
1 2 13
1 3 12
2 1 5
2 2 7
- 分離逗號分隔
ClassID
字段分成單獨的行,保留它們在第一個表中的順序 - 在插入時填充
Numbering
行。Numbering
列對於每批ClassID
都有順序整數,這也是爲什麼ClassID
需要保持有序。
我已經用下面的函數嘗試這樣的:
CREATE FUNCTION dbo.Split
(
@String NVARCHAR(MAX)
)
RETURNS @SplittedValues TABLE(
Value INT
)
AS
BEGIN
DECLARE @SplitLength INT
DECLARE @Delimiter VARCHAR(10)
SET @Delimiter = ','
WHILE len(@String) > 0
BEGIN
SELECT @SplitLength = (CASE charindex(@Delimiter, @String)
WHEN 0 THEN
datalength(@String)/2
ELSE
charindex(@Delimiter, @String) - 1
END)
INSERT INTO @SplittedValues
SELECT cast(substring(@String, 1, @SplitLength) AS INTEGER)
WHERE
ltrim(rtrim(isnull(substring(@String, 1, @SplitLength), ''))) <> '';
SELECT @String = (CASE ((datalength(@String)/2) - @SplitLength)
WHEN 0 THEN
''
ELSE
right(@String, (datalength(@String)/2) - @SplitLength - 1)
END)
END
RETURN
END
,但它只是部分有效。它複製行的正確次數(例如,ItemID=1
的三次,以及上述示例中的ItemID=2
的兩次),但它們是行的精確副本(全稱爲「10,13,12」)和逗號分隔零件不分割。函數中也沒有任何內容可以添加到Numbering
列中。
所以,我有兩個問題:如何修改上述函數來拆分ClassID
字符串,以及爲了正確增加Numbering
列而添加的內容?
謝謝!
它的工作原理主要是!有一個問題,一些'Numbering = 1'的列有一個空的'ClassID'。有些列以逗號結尾,即「10,13,12」是什麼影響它?此外,如果'ClassID'具有多於3個條目,這仍然可以工作嗎? – jjjjjjjjjjj
我解決了這個問題,方法是編寫一個在你之前執行的CTE,並刪除尾部的逗號(如果有的話),以及後面的CTE刪除空白行。感覺有點麻煩,但它現在按預期工作。 – jjjjjjjjjjj
如果字符串以逗號結尾,並且將所有內容都轉換爲INT,則最終會得到0而不是null。我添加了一個例子,並確保它處理只有1個條目的行。 – Andrew