Любые скрытые ловушки, изменяющие столбцы от varchar (8000) до varchar (max)?

У меня много (более тысячи мест) устаревшего кода T-SQL, который делает только INSERT в столбце varchar(8000) в таблице служебных программ. Наши потребности изменились, и теперь эта колонка должна иметь возможность обрабатывать большие значения. В результате мне нужно сделать этот столбец varchar(max). Это простой столбец данных, в котором нет поисковых запросов, нет индекса на нем, только одна процедура читает его, это INSERT и забывает приложение (почти как запись в журнале).

Я планирую внести изменения только в несколько мест, которые фактически будут генерировать большие данные, и в одной хранимой процедуре, обрабатывающей этот столбец.

  • Есть ли скрытые ловушки, изменяющие столбец от varchar(8000) до varchar(max)?
  • Будут ли выполняться все строковые функции T-SQL, LEN(), RTRIM(), SUBSTRING() и т.д.
  • Может ли кто-нибудь представить какую-либо причину, по которой я должен был бы внести какие-либо изменения в код, который считает, что столбец все еще varchar(8000)?

Ответ 1

  • Все типы MAX имеют небольшое ограничение производительности, см. Сравнение производительности varchar (max) vs varchar (N).
  • Если ваше обслуживание включает в себя онлайн-операции (перестроение онлайн-индекса), вы потеряете возможность их выполнять. Операции онлайн не поддерживаются для таблиц с столбцами BLOB:
    • Кластеризованные индексы должны быть созданы, перестроены или удалены автономно, когда базовая таблица содержит типы данных больших объектов (LOB): изображение, ntext, текст, varchar (max), nvarchar (max), varbinary (max) и xml.
    • Nonunique некластеризованные индексы могут быть созданы онлайн, когда таблица содержит типы данных LOB, но ни один из этих столбцов не используется в определении индекса как в качестве ключевых, так и для неключевых (включенных) столбцов. Некластеризованные индексы, определенные столбцами типа данных LOB, должны быть созданы или перестроены в автономном режиме.

Снижение производительности действительно невелико, поэтому я не стал бы беспокоиться об этом. Потеря способности делать онлайн-перестройки может быть проблематичной для действительно горячих таблиц операций, которые должны быть онлайн. Если онлайн-операции не являются обязательными, я бы проголосовал за это и изменил его на MAX.

Ответ 2

Crystal Reports 12 (и другие версии, насколько мне известно) не обрабатывает varchar (max) правильно и интерпретирует его как varchar (255), что приводит к усечению данных в отчетах.

Итак, если вы используете Crystal Reports, это недостаток для varchar (max). Или недостаток использования Crystal, если быть точным.

См:
http://www.crystalreportsbook.com/Forum/forum_posts.asp?TID=5843&PID=17503
http://michaeltbeeitprof.blogspot.com/2010/05/crystal-xi-and-varcharmax-aka-memo.html

Ответ 3

Если вам действительно не нужны индексы, и это большой столбец, вы должны быть в порядке. Varchar (max) кажется вам именно тем, что вам нужно, и у вас будет меньше проблем с существующим кодом, чем если бы вы использовали текст.

Обязательно проверяйте все обновления, где текст добавляется в существующий текст. Он должен работать с использованием регулярной конкатенации, но я хотел бы это доказать.