Dinamik içeriğe sahip bir sitede tüm sayfalarda yer alan bir telefon numarasını yenisiyle değiştirmek istediğimde T-SQL REPLACE komutunu kullanabilirim diye düşünmüştüm. Ancak komutu çalıştırdığımda ntext ve text alanlar için replace komutunun aşağıdaki gibi hata verdiğini gördüm.
Server: Msg 8116, Level 16, State 1, Line 1
Argument data type ntext is invalid for argument 1 of replace function.
SQL Server 'ın böyle bir hata döndürmesinin nedeni TEXT ya da NTEXT veri tipine sahip sütunlarda normal REPLACE komutunu işletemiyor olmamız. Çünkü SQL Server bu veri tipine sahip kolonlarda veriyi değil verinin saklandığı yeri gösteren 16 byte 'lık bir pointer 'ı saklıyor. Böyle bir pointer üzerinde de REPLACE komutunu çalıştıramıyoruz.
Biraz araştırdığımda aşağıdaki kodlarla ntext alanlar içinde replace yapılabildiğini gördüm. text tipindeki alana sahip bir tabloda ise yorumlarla belirtilen değişiklikleri gerçekleştirmek gerekiyor.
DECLARE
@TextPointer BINARY(16),
@TextIndex INT,
@oldString NVARCHAR(32), -- text alan için VARCHAR olmalı
@newString NVARCHAR(32), -- text alan için VARCHAR olmalı
@lenOldString INT,
@currentDataID INT;
SET @oldString = N'444 0 849'; -- text alan için N kalkmalı
SET @newString = N'444 2 538'; -- text alan için N kalkmalı
IF CHARINDEX(@oldString, @newString) > 0
BEGIN
PRINT 'Sonsuz döngüyü önlemek için çıkış';
END
ELSE
BEGIN
SELECT 'Değiştirmeden Önce:';
SELECT ID, ICERIK FROM ICERIK_AJTR where ICERIK like '%444 0 849%';
SET @lenOldString = DATALENGTH(@oldString)/2; -- text alan için /2 kalkmalı
DECLARE irows CURSOR
LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
SELECT
ID
FROM
ICERIK_AJTR
WHERE
PATINDEX('%'+@oldString+'%', ICERIK) > 0;
OPEN irows;
FETCH NEXT FROM irows INTO @currentDataID;
WHILE (@@FETCH_STATUS = 0)
BEGIN
SELECT
@TextPointer = TEXTPTR(ICERIK),
@TextIndex = PATINDEX('%'+@oldString+'%', ICERIK)
FROM
ICERIK_AJTR
WHERE
ID = @currentDataID;
WHILE
(
SELECT
PATINDEX('%'+@oldString+'%', ICERIK)
FROM
ICERIK_AJTR
WHERE
ID = @currentDataID
) > 0
BEGIN
SELECT
@TextIndex = PATINDEX('%'+@oldString+'%', ICERIK)-1
FROM
ICERIK_AJTR
WHERE
ID = @currentDataID;
UPDATETEXT ICERIK_AJTR.ICERIK @TextPointer @TextIndex @lenOldString @newString;
END
FETCH NEXT FROM irows INTO @currentDataID;
END
CLOSE irows;
DEALLOCATE irows;
SELECT 'Değişimden sonra:';
SELECT ID, ICERIK FROM ICERIK_AJTR where ICERIK like '%444 0 849%' ;
SELECT ID, ICERIK FROM ICERIK_AJTR where ICERIK like '%444 2 538%' ;
END
|