使用 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;
我有一个 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;