You can insert words into the first table than to parse text forms and insert them into a child table with a link to the parent table.
A link to the parent table can be obtained by joining in the word column (I think this is unique) or by doing some MERGE + OUTPUT things to get SOURCE.ID (from @words_csv) and INSERTED.ID in one step. How do you like.
The analysis can be implemented in many ways, check this example (in fact, I would not recommend dealing with sql at all).
DECLARE @words_csv TABLE (Id INT IDENTITY(1, 1), Word VARCHAR(100), WordForms VARCHAR(1000)) INSERT INTO @words_csv(word, wordforms) VALUES ('abandon', 'abandoned, abandoning, abandonment, abandons, eg'), ('abstract', 'abstraction, abstractions, abstractly, abstracts') --INSERT INTO [dbo].[Words](word) --SELECT w.word --FROM @words_csv w ;WITH word_forms_extracted AS ( SELECT w.id, w.word, ltrim(rtrim(cast(case when CHARINDEX(',', w.WordForms) > 0 then substring(w.wordforms, 1, CHARINDEX(',', w.WordForms)-1) end AS VARCHAR(1000)))) wordform, stuff(w.wordforms, 1, CHARINDEX(',', w.WordForms), '') wordforms FROM @words_csv w UNION ALL SELECT w.id, w.word, ltrim(rtrim(cast(case when CHARINDEX(',', wfe.WordForms) > 0 then substring(wfe.wordforms, 1, CHARINDEX(',', wfe.WordForms)-1) else wfe.wordforms end AS VARCHAR(1000)))) wordform, case when CHARINDEX(',', wfe.WordForms) > 0 then stuff(wfe.wordforms, 1, CHARINDEX(',', wfe.WordForms), '') ELSE '' end wordforms FROM @words_csv w INNER JOIN word_forms_extracted wfe ON wfe.id = w.id WHERE wfe.wordforms != '' ) SELECT wf.id, wf.word, wf.wordform FROM word_forms_extracted wf --INNER JOIN [dbo].[Words] w --ON w.word = wf.word WHERE wf.wordform NOT IN ('', 'eg') ORDER BY wf.id, wf.wordform OPTION(MAXRECURSION 1000)
The SELECT finale can be easily changed to INSERT INTO dbo.WordForms (...) SELECT ... link to dbo.Words obtained here, as you can see by joining the word column.