我有一个由CRLF分隔的各种文本组成的varchar列。我需要分割这个列,每个部分运行直到下一个CRLF。然后这些子字符串需要作为新行插入一个新表(我已经创建)。带有varchar列的表是tblJobsTest,列称为Notes。新表是tblJobAppointmentNotes,由JobID和AppointmentNote组成。使用CRLF +分割变量字段+插入新表
这里是我到目前为止....
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
我遇到的问题是列名“注意”没有标识。 CHARINDEX无法查找我猜测的列,所以我认为我需要使用某种形式的CTE,因此此代码可以引用tblJobsTest中的每一行?
有没有人有任何想法?谢谢
你从语句期待什么'SELECT LEN(注释)FROM tblJobsTest'作为WHILE循环的条件读取?其实际含义是:'从表'tblJobsTest'中选择字段'Notes'的内容长度,选择一个随机行'。这确实是一个奇怪的检查... – Paolo
使用字符串分割函数,而不是使用while循环和charindex来做这个基于set的。看到这里的一些例子:http://sqlperformance.com/2012/07/t-sql-queries/split-strings –
谢谢:)。保罗是我遇到的问题。列名称注释在分钟时不明确,我想更改此代码,以便while语句选择每行并根据varchar的长度运行代码。 – Brett