使用 CRLF 拆分 Varchar 字段 + 插入新字段 Table

Spliting Varchar Fields With CRLF + Inserting Into New Table

我有一个 varchar 列,其中包含由 CRLF 分隔的各种文本。我需要拆分此列,每个部分 运行 直到下一个 CRLF。然后需要将这些子字符串作为新行插入到新的 table(我已经创建)中。带有 varchar 列的 table 是 tblJobsTest,该列称为 Notes。新的 table 是 tblJobAppointmentNotes,由 JobID 和 AppointmentNote 组成。

这是我目前所掌握的....

DECLARE @crlf CHAR(2) = CHAR(13) + CHAR (10)
DECLARE @Note VARCHAR(MAX) = null

WHILE (SELECT LEN(Notes) FROM tblJobsTest) > 0
BEGIN
IF CHARINDEX(@crlf,Notes) > 0
    BEGIN
    SET @Note = SUBSTRING(Notes, 0, CHARINDEX(@crlf,Notes))
    INSERT INTO tblJobAppointmentNotes (AppointmentNote)
    VALUES (@Note)

    Update tblJAN
    SET tblJAN.JobID = tblJT.JobID
    From tblJobAppointmentNotes tblJAN
    INNER JOIN tblJobsTest tblJT ON tblJAN.JobID = tblJT.JobID

    UPDATE tblJobsTest
    SET Notes= SUBSTRING(Notes, LEN(@Note) + 1, LEN(Notes))
    END
ELSE
    INSERT INTO tblJobAppointmentNotes (JobID, AppointmentNote)
    SELECT JobID, Notes FROM tblJobsTest
END

我遇到的问题是未识别列名称 'Notes'。 CHARINDEX 无法查找我猜测的列,所以我想我需要使用某种形式的 CTE,以便此代码可以引用 tblJobsTest 中的每一行?

有人有什么想法吗?谢谢

给你...将其粘贴到空查询中 window 并执行。适应您的需求...

编辑:相同的过程,但基于集合的方法一次完成此操作 table...

DECLARE @TableWithLongText TABLE(ID INT, LongText VARCHAR(MAX));
DECLARE @TableToInsertParts TABLE(ID INT IDENTITY, TWLT_ID INT,PartNr INT, eachLine VARCHAR(MAX));


INSERT INTO @TableWithLongText VALUES
 (1,'This' + CHAR(13) + CHAR(10) + 'is the text for ID=1' + CHAR(13) + CHAR(10) + 'with' + CHAR(13) + CHAR(10) + '4 lines')
,(2,'This' + CHAR(13) + CHAR(10) + 'is the text for ID=2' + CHAR(13) + CHAR(10) + 'with 3 lines');

WITH Recoded(ID,x) AS
(
    SELECT ID 
          ,CAST('<root><r>' +  REPLACE(twlt.LongText,CHAR(13)+CHAR(10),'</r><r>') + '</r></root>' AS XML)
    FROM @TableWithLongText AS twlt
)
INSERT INTO @TableToInsertParts(TWLT_ID,PartNr,eachLine)
SELECT ID
      ,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID)
      ,a.b.value('.','varchar(max)')
FROM Recoded
CROSS APPLY Recoded.x.nodes('/root/r') a(b);

SELECT * FROM @TableToInsertParts;