Je suis en train de passer d'une base de données héritée mal conçue à une nouvelle base de données. Dans l'ancienne base de données, il y a tableA avec les champs Id et Commodities. Id est la clé primaire et contient un int et Commodities contient une liste délimitée par des virgules.SQL: fractionner une ligne en plusieurs (normalisation)
TableA:
id | commodities
1135 | fish,eggs,meat
1127 | flour,oil
Dans la nouvelle base de données, je veux tableB être dans l'identifiant de forme, produit où chaque produit est un élément unique dans la liste délimitée par des virgules dans tableA.
TableB:
id | commodity
1135 | fish
1135 | eggs
1135 | meat
1127 | flour
1127 | oil
J'ai une fonction, fonctionn, que lorsque donné une carte d'identité, une liste et un séparateur, retourne une table avec un champ identifiant et élément. Comment puis-je utiliser cette fonction pour transformer les deux champs de tableA en tableB?
(Note: J'ai eu du mal à trouver quoi titre cette question S'il vous plaît ne hésitez pas à modifier le titre pour qu'il reflète plus précisément la question.!)
Voici le code de fonction:
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
Qu'est-ce que vous voulez dire est communément refered comme normaliztion (1. forme normale pour être précis). Peut-être que vous voulez ajouter cela à votre titre. –
Base de données? Version? –
SQl Server 2000 – dmr