Макс. Размер строки в SQL Server 2012 с полями varchar (max)

Я создал таблицу с типами столбцов как nvarchar(max), и я понимаю, что они могут поддерживать 2 ГБ. Однако при вставке я все равно получаю эту ошибку:

Невозможно создать строку размера 8061, которая больше допустимого максимального размера строки 8060.

Есть ли глобальная настройка в базе данных, или есть другой лимит, который я нажимаю? Существует ли ограничение на количество полей varchar(max) для таблицы?

Ответ 1

SQL-сервер использует страницу для хранения данных. Размер страницы - 8 КБ.

Значит, размер записи (размер строки) на SQL-сервере не может превышать 8060 байт.

Если данные не установлены в 8060 байт, используются указатели ссылок. Когда комбинация столбцов типа varchar, nvarchar, varbinary, sql_variant или CLR превышает этот предел, SQL Server Database Engine перемещает столбец записи с наибольшей шириной на другую страницу в блоке распределения ROW_OVERFLOW_DATA, сохраняя при этом 24-байтовый указатель на исходной странице.

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

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

Предел размера записи для таблиц, в которых использовать разреженные столбцы, составляет 8018 байт. Когда преобразованные данные плюс существующие данные записи превышают 8,018 байт, возвращается MSSQLSERVER ERROR 576. Когда столбцы преобразуются между разреженными и несравненными типами, Database Engine сохраняет копию текущих данных записи. Это временно удваивает объем памяти, необходимый для записи.,

Чтобы получить информацию о таблицах или индексах, которые могут содержать данные переполнения строк, используйте динамическую функцию управления sys.dm_db_index_physical_stats.

Ответ 2

В документации SQL Server:

Длина отдельных столбцов все равно должна находиться в пределах 8 000 байт для varchar, nvarchar, varbinary, sql_variant и CLR определяемые пользователем столбцы типов. Только их общая длина может превышать 8 060-байтовый предел строки таблицы.

Сумма других столбцов типа данных, включая char и nchar данные, должен находиться под пределом строки в 8,060 байт. Большие данные объекта также освобождаются от ограничения в размере 8 060 байт.

Дополнительная информация здесь: https://technet.microsoft.com/en-us/library/ms186981%28v=sql.105%29.aspx

Ответ 3

Это происходит из более раннего потока StackOverflow, который можно найти здесь:

Невозможно создать строку размера 8937, которая больше допустимого максимума 8060

Ошибка вызвана тем, что вы не можете иметь строку на SQL-сервере, размер которой превышает 8 КБ (размер 1 страница), поскольку строки не разрешены для охвата страниц - это основной предел SQL Server [...]

Обратите внимание, что SQL-сервер позволит вам создать таблицу, однако если вы попытаетесь на самом деле вставить любые данные, которые охватывают несколько страниц, то это приведет к вышеуказанной ошибке. Конечно, это не совсем похоже, потому что если выше была вся правда, то один столбец VARCHAR (8000) заполнил бы строку в таблице! (Это имело место). SQL Server 2005 обошел это ограничение, разрешив хранить определенные данные из строки на другой странице и вместо этого вместо этого оставил 24-разрядный указатель.

Я бы предложил нормализовать таблицу в одну или несколько реляционных таблиц.