Buna dönüş nvarchar(max)
ve geri dönüş ntext
, hayatı kod açısından daha basit hale getirir, ancak tüm CPU ve kayıt yükü anlamına gelen tüm (belki de çok büyük) değerin dönüştürülmesi ve yeniden yazılması anlamına gelir.
Bir alternatif kullanmaktır UPDATETEXT
. Bu, tıpkı olduğu gibi kullanımdan kaldırılmıştır, ntext
ancak günlük tutma yükünü önemli ölçüde azaltabilir. Aşağı yönde, metin işaretçileri kullanmak anlamına gelir ve her seferinde yalnızca bir satırda çalışır.
Aşağıdaki örnek kod, bu sınırlamaya geçici bir çözüm bulmak için bir imleç kullanır ve PATINDEX
bunun yerine ilkiyle doğrudan çalışan birkaç işlevdenCHARINDEX
biri olduğu için kullanır :ntext
Örnek veri
CREATE TABLE dbo.PhilsTable
(
comment ntext NULL,
anothercomment nvarchar(50) NULL
);
INSERT dbo.PhilsTable
(comment, anothercomment)
VALUES
(
CONVERT(ntext,
N'This is a test UPDATEHERE This is the end of the test ' +
REPLICATE (CONVERT(nvarchar(max), N'x'), 1000000)),
CONVERT(nvarchar(50), N'. This is inserted.')
),
(
CONVERT(ntext,
N'This is a test UPDATEHERE This is the end of the test ' +
REPLICATE (CONVERT(nvarchar(max), N'x'), 1000000)),
CONVERT(nvarchar(50), N'. This is inserted.')
),
(
CONVERT(ntext,
N'This is a test UPDATEHERE This is the end of the test ' +
REPLICATE (CONVERT(nvarchar(max), N'x'), 1000000)),
CONVERT(nvarchar(50), N'. This is inserted.')
);
İmleç bildirimi
DECLARE c
CURSOR GLOBAL
FORWARD_ONLY
DYNAMIC
SCROLL_LOCKS
TYPE_WARNING
FOR
SELECT
TxtPtr = TEXTPTR(PT.comment),
Src = PT.anothercomment,
Offset = PATINDEX(N'%UPDATEHERE%', PT.comment) + LEN(N'UPDATEHERE') - 1
FROM dbo.PhilsTable AS PT
WHERE
PT.comment LIKE N'%UPDATEHERE%'; -- LIKE works with ntext
OPEN c;
İşleme döngüsü
DECLARE
@Ptr binary(16),
@Src nvarchar(50),
@Offset integer;
SET STATISTICS XML OFF; -- No cursor fetch plans
BEGIN TRANSACTION;
WHILE 1 = 1
BEGIN
FETCH c INTO @Ptr, @Src, @Offset;
IF @@FETCH_STATUS = -2 CONTINUE; -- row missing
IF @@FETCH_STATUS = -1 BREAK; -- no more rows
IF 1 = TEXTVALID('dbo.PhilsTable.comment', @Ptr)
BEGIN
-- Modify ntext value
UPDATETEXT dbo.PhilsTable.comment @Ptr @Offset 0 @Src;
END;
END;
COMMIT TRANSACTION;
CLOSE c; DEALLOCATE c;