Вставка записей из таблицы с исключенными строками - PullRequest
1 голос
/ 24 августа 2011

У меня есть структура таблицы, которая содержит столбец идентификатора и столбец, который содержит разделенную строку. Чего я хотел бы добиться - это вставить разделенную строку в новую таблицу в виде отдельных записей для каждого из значений в разделенной разделенной строке.

Моя структура таблицы для исходной таблицы выглядит следующим образом:

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.

Заранее благодарю за любую помощь, которую вы можете оказать.

Мэтт

1 Ответ

1 голос
/ 24 августа 2011

Что ж, ваше утверждение SELECT, которое получает «следующего» человека, не имеет предложения WHERE, поэтому я не уверен, как SQL Server узнает, что перейти к следующему человеку. Если это разовая задача, почему бы не использовать курсор?

CREATE TABLE #n(n INT PRIMARY KEY);

INSERT #n(n) SELECT TOP 100 number     FROM [master].dbo.spt_values 
WHERE number > 0    GROUP BY number    ORDER BY number;

DECLARE 
    @PersonID VARCHAR(8),  @delimStr VARCHAR(100), 
    @str VARCHAR(100),     @c CHAR(1);

DECLARE c CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY
    FOR SELECT PersonID, delimStr FROM dbo.tablea;

OPEN c;

FETCH NEXT FROM c INTO @PersonID, @delimStr;

SET @c = ',';

WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @delimStr = @c + @delimStr + @c;

    -- INSERT dbo.tableb(tkinit, [dayName])
    SELECT @PersonID, LTRIM(SUBSTRING(@delimStr, n+1, CHARINDEX(@c, @delimStr, n+1)-n-1))
        FROM #n AS n
        WHERE n.n <= LEN(@delimStr) - 1
        AND SUBSTRING(@delimStr, n.n, 1) = @c;

    FETCH NEXT FROM c INTO @PersonID, @delimStr;
END

CLOSE c;
DEALLOCATE c;

DROP TABLE #n;

Если вы создаете таблицу постоянных чисел (очевидно, с более чем 100 строками), вы можете использовать ее для многих целей. Вы можете создать функцию разделения, которая позволит вам делать все выше без курсора (ну, без явного курсора). Но это, вероятно, сработает лучше позже, когда вы, наконец, выйдете из SQL Server 2000. Более новые версии SQL Server имеют гораздо более гибкие и расширяемые способы выполнения разделения и объединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...