1

我有一张桌子

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

但似乎不起作用。

4

2 回答 2

0

基于这个问题,我学到了解决这个问题的更好方法。您只需要使用CROSS APPLY建议的函数fn_ParseText2Table

样品小提琴

INSERT INTO KindergartenStudents
  (FK_KindergartenId, StudentName)
SELECT
  sbk.FK_KindergartenId,
  parsed.txt_value
FROM
  StudentsByKindergarten sbk
    CROSS APPLY
  fn_ParseText2Table(sbk.StudentList, ',') parsed
于 2014-08-29T04:07:55.700 回答
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
于 2014-09-13T00:12:11.433 回答