Теперь код написан «по всем правилам»:
на строку с идентификатором 1 накладывается
коллективная блокировка, что предотвращает ее изменения из других транзакций;
смещение проверяется на отрицательные значения, так
как функция patindex может вернуть 0, если не найдет шаблон;
длина считываемого текста также проверяется на
неотрицательные значения.
Функция READTEXT не вернет вам всего объема данных.
Размер максимально доступных данных, которые можно получить с помощью этой
функции, равен @@textsize. По умолчанию это значение равно 4 Кб. Увеличить его
можно с помощью функции set textsize. Для сброса переменной в значение по умолчанию
установите размер, равный нулю.
WRITETEXT
Эта функция оставлена только для совместимости. Ее
заменила более мощная UPDATETEXT, которую я рассмотрю позднее.
Вот синтаксис функции WRITETEXT:
WRITETEXT
{ table.column text_ptr }
[ WITH
LOG ] { data }
|
table.column – таблица и колонка;
text_ptr – указатель;
with log – игнорируется для SQL Server 2000;
Data – данные. Их размер не может превышать 120 Кб.
WRITETEXT полностью перезаписывает содержимое колонки.
Для операции обновления также актуальна проблема действительности указателя. Но
здесь уже недостаточно просто установить коллективную блокировку на обновляемую
строку, так как это может привести к взаимоблокировке, например, если две
транзакции одновременно получают коллективную блокировку и пытаются
сконвертировать ее в монопольную. Для предотвращения подобной ситуации
необходимо наложить блокировку обновления. В следующем примере производится
обновление бинарных данных в первой строке: