2014-08-28 83 views
1

我有一個表SQL服務器:插入多行到一個不同的表

CREATE TABLE [StudentsByKindergarten] 
(
    [FK_KindergartenId] [int] IDENTITY(1,1) NOT NULL, 
    [StudentList] [nvarchar] 
) 

在條目

(1, "John, Alex, Sarah") 
(2, "") 
(3, "Jonny") 
(4, "John, Alex") 

我要遷移這個信息給基於列的表下表。

CREATE TABLE [KindergartenStudents] 
(
    [FK_KindergartenId] [int] NOT NULL, 
    [StudentName] [nvarchar] NOT NULL) 
) 

,使其具有

(1, "John") 
(1, "Alex") 
(1, "Sarah") 
(3, "Jonny") 
(4, "John") 
(4, "Alex") 

我想我可以使用類似的答案的東西在這裏實現分割功能:How do I split a string so I can access item x?

這裏使用功能:

http://www.codeproject.com/Articles/7938/SQL-User-Defined-Function-to-Parse-a-Delimited-Str

我可以做點像這,

INSERT INTO [KindergartenStudents] ([FK_KindergartenId], [Studentname]) 
    SELECT 
     sbk.FK_KindergartenId, 
     parsed.txt_value 
    FROM 
     [StudentsByKindergarten] sbk, dbo.fn_ParseText2Table(sbk.StudentList,',') parsed 
GO 

但似乎沒有工作。

+0

這是一個很好的參考:http://www.sqlservercentral.com/articles/Tally+Table/72993/ – 2014-08-29 00:05:34

+1

使用@ wewesthemenace的鏈接,一個問題像這樣的一個例子是在http:/ /dba.stackexchange.com/questions/72292/sp​​litting-a-csv-column-from-select-query-into-multiple-columns/72298#72298 – 2014-08-29 01:46:39

+0

@梅麗莎,我已經通過我的新答案切換我的舊接受的答案(使用交叉應用),我相信對未來的讀者更好。如果您不喜歡新的答案,請隨時再次切換接受的答案。 – Zanon 2014-09-26 03:17:32

回答

0

基於此question,我學到了一個更好的方法來解決這個問題。你只需要使用CROSS APPLY和你建議的功能fn_ParseText2Table

Sample Fiddle

INSERT INTO KindergartenStudents 
    (FK_KindergartenId, StudentName) 
SELECT 
    sbk.FK_KindergartenId, 
    parsed.txt_value 
FROM 
    StudentsByKindergarten sbk 
    CROSS APPLY 
    fn_ParseText2Table(sbk.StudentList, ',') parsed 
0

我用你建議的功能(fn_ParseText2Table)和下面的T-SQL工作。你可以用這個小提琴來測試它:link

BEGIN 
    DECLARE 
    @ID int, 
    @iterations int 

    -- Iterate the number of not empty rows 
    SET @iterations = 
     (SELECT 
      COUNT(*) 
     FROM 
      StudentsByKindergarten 
     WHERE 
      DATALENGTH(StudentList) > 0 
     ) 

    WHILE (@iterations > 0) 

    BEGIN 

    -- Select the ID of row_number() = @iteration 
    SET @ID = 
      (SELECT 
      FK_KindergartenId 
      FROM 
      (SELECT 
       *, 
       ROW_NUMBER() OVER (ORDER BY FK_KindergartenId DESC) as rn 
      FROM 
       StudentsByKindergarten 
      WHERE 
       DATALENGTH(StudentList) > 0) rows 
      WHERE 
       rows.rn = @iterations 
     ) 

    SET @iterations -= 1 

    -- Insert the parsed values 
    INSERT INTO KindergartenStudents 
     (FK_KindergartenId, StudentName) 
    SELECT 
     @ID, 
     parsed.txt_value 
    FROM 
     fn_ParseText2Table 
    (
     (SELECT 
     StudentList 
     FROM 
     StudentsByKindergarten 
     WHERE 
     FK_KindergartenId = @ID), 
    ',') parsed 
    END 
END 
相關問題