Если вы можете использовать CURSOR для манипулирования несколькими строками, этот следующий скрипт может помочь вам, предлагая идею. Обратите внимание, что я рассмотрел конечные точки 20, 40 и 60.
ВАЖНО: сначала проверьте этот скрипт в своей тестовой базе данных
ВАЖНО: Добавьте необходимое условие WHERE в инструкцию SELECT. В противном случае будут выбраны все записи
DECLARE @NAME NVARCHAR(MAX)
DECLARE @F_NAME NVARCHAR(MAX)
DECLARE @CUT_1 INT
DECLARE @CUT_2 INT
DECLARE db_cursor CURSOR FOR
SELECT f_name,f_content
FROM your_table
--WHERE Plese add conditions to pick only columns you wants to adjust
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @F_NAME,@NAME
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @A TABLE (POS INT)
DECLARE @POS INT
DECLARE @OLDPOS INT
SELECT @OLDPOS=0
SELECT @POS=PATINDEX('%~%',@name)
WHILE @POS > 0 AND @OLDPOS <> @POS
BEGIN
INSERT INTO @A VALUES (@POS)
SELECT @OLDPOS=@POS
SELECT @POS=PATINDEX('%~%',SUBSTRING(@NAME,@POS + 1,LEN(@NAME))) + @POS
END
SELECT @CUT_1 = ISNULL(MAX([pos]),4000) from @a where pos <= 4000
SELECT @CUT_2 = ISNULL(MAX([pos]),@CUT_1+4000) from @a where pos > @CUT_1 AND pos <= @CUT_1+4000
UPDATE your_table
SET [f_content_varchar1] = SUBSTRING(@Name,1,@CUT_1),
[f_content_varchar2] = SUBSTRING(@Name,@CUT_1+1,@CUT_2-@CUT_1),
[f_content_varchar3] = SUBSTRING(@Name,@CUT_2+1,12000-@CUT_2)
WHERE f_name = @F_NAME
DELETE FROM @A
SET @POS = NULL
SET @OLDPOS = NULL
SET @OLDPOS = NULL
FETCH NEXT FROM db_cursor INTO @F_NAME,@NAME
END
CLOSE db_cursor
DEALLOCATE db_cursor