У меня есть структура таблицы, которая содержит столбец идентификатора и столбец, который содержит разделенную строку. Чего я хотел бы добиться - это вставить разделенную строку в новую таблицу в виде отдельных записей для каждого из значений в разделенной разделенной строке.
Моя структура таблицы для исходной таблицы выглядит следующим образом:
CREATE TABLE tablea(personID VARCHAR(8), delimStr VARCHAR(100))
Некоторые примеры данных:
INSERT INTO tablea (personID, delimStr) VALUES ('A001','Monday, Tuesday')
INSERT INTO tablea (personID, delimStr) VALUES ('A002','Monday, Tuesday, Wednesday')
INSERT INTO tablea (personID, delimStr) VALUES ('A003','Monday')
Моя таблица назначения выглядит следующим образом:
CREATE TABLE tableb(personID VARCHAR(8), dayName VARCHAR(10))
Я пытаюсь создать хранимую процедуру для вставки, мой SP до сих пор выглядит так:
CREATE PROCEDURE getTKWorkingDays
@pos integer = 1
, @previous_pos integer = 0
AS
BEGIN
DECLARE @value varchar(50)
, @string varchar(100)
, @ttk varchar(8)
WHILE @pos > 0
BEGIN
SELECT @ttk = personID
, @string = delimStr
FROM dbo.tablea
SET @pos = CHARINDEX(',', @string, @previous_pos + 1)
IF @pos > 0
BEGIN
SET @value = SUBSTRING(@string, @previous_pos + 1, @pos - @previous_pos - 1)
INSERT INTO dbo.tableb ( personID, dayName ) VALUES ( @ttk, @value )
SET @previous_pos = @pos
END
END
IF @previous_pos < LEN(@string)
BEGIN
SET @value = SUBSTRING(@string, @previous_pos + 1, LEN(@string))
INSERT INTO dbo.tableb ( tkinit, dayName ) VALUES ( @ttk, @value )
END
END
Данные, которые были вставлены (только 1 запись из 170 или около того в исходной таблице, которая после разделения разделенной строки должна привести примерно к 600 или около того записям в новой таблице), была неверной.
То, что я ожидаю увидеть, используя приведенные выше примеры данных:
personID dayName
A001 Monday
A001 Tuesday
A002 Monday
A002 Tuesday
A002 Wednesday
A003 Monday
Может ли кто-нибудь указать какие-либо ресурсы или определить, где я ошибаюсь, и как заставить этот запрос работать?
База данных - MS SQL Server 2000.
Заранее благодарю за любую помощь, которую вы можете оказать.
Мэтт