Я нахожусь в середине обновления из плохо разработанной устаревшей базы данных в новую базу данных. В старой базе данных есть таблицаA с полями Id и Commodities. Идентификатор является основным ключом и содержит int и Commodities содержит список с разделителями-запятыми.SQL: разбить одну строку на многие (нормализация)
TableA:
id | commodities
1135 | fish,eggs,meat
1127 | flour,oil
В новой базе данных, я хочу TableB быть в виде идентификатора, товарное, где каждый товар есть один элемент из списка разделенных запятыми в TABLEA.
TableB:
id | commodity
1135 | fish
1135 | eggs
1135 | meat
1127 | flour
1127 | oil
У меня есть функция, functionA, что когда данный идентификатор, список, и разделитель, возвращает таблицу с полем идентификатора и пункта. Как я могу использовать эту функцию, чтобы превратить два поля из таблицы А в таблицу Б?
(Примечание: У меня была проблема, выясняя, что титул этот вопрос, пожалуйста, не стесняйтесь изменить название, чтобы сделать его более точно отразить этот вопрос.!)
Вот код функции:
ALTER FUNCTION dbo.functionA
(
@id int,
@List VARCHAR(6000),
@Delim varchar(5)
)
RETURNS
@ParsedList TABLE
(
id int,
item VARCHAR(6000)
)
AS
BEGIN
DECLARE @item VARCHAR(6000), @Pos INT
SET @List = LTRIM(RTRIM(@List))+ @Delim
SET @Pos = CHARINDEX(@Delim, @List, 1)
WHILE @Pos > 0
BEGIN
SET @item = LTRIM(RTRIM(LEFT(@List, @Pos - 1)))
IF @item <> ''
BEGIN
INSERT INTO @ParsedList (id, item)
VALUES (@id, CAST(@item AS VARCHAR(6000)))
END
SET @List = RIGHT(@List, LEN(@List) - @Pos)
SET @Pos = CHARINDEX(@Delim, @List, 1)
END
RETURN
END
Что вы имеете в виду, обычно упоминается как normaliztion (1 нормальной форме, если быть точным). Возможно, вы хотите добавить это в свой заголовок. –
База данных? Версия? –
SQl Server 2000 – dmr