SQL Server 2005 - достижение ограничения размера строки таблицы - PullRequest
4 голосов
/ 02 сентября 2011

Есть ли чистый способ определить размер строки таблицы перед добавлением в нее нового столбца и не превышать ограничение в 8060 байт?

Например, если длина строки таблицы в настоящее время составляет 8055 байтови я хочу добавить дату и время (8 байт), это будет превышать 8063 байта (исключая нулевое отображение).

Однако, если я добавлю целое число (4 байта), этодать ему 8059 байт, что соответствует размеру таблицы (исключая нулевое отображение).

В настоящее время я могу получить размер таблицы, однако мне сложно создать функцию SQL, чтобы получить размертипа данных (int, datetime и т. д.) и того, нужен ли тип данных дополнительный байт для нулевого отображения.

Есть ли функция, которую я могу использовать / разработать, которая принимает две переменные: tablename и datatype: fnIsEnoughStorage ('table1', int) и возвращает логическое значение (да / нет) из скалярной функции.

если true, я продолжу выполнение команды ALTER TABLE после определения теста.

Ответы [ 2 ]

5 голосов
/ 02 сентября 2011

Этот запрос здесь определит, какие таблицы потенциально опасны и имеют максимальный возможный размер строки, который может превышать 8060 доступных байтов:

;WITH TableRowSizes AS
(
    SELECT 
        t.NAME 'TableName',
        COUNT(1) 'NumberOfColumns',
        SUM (c.max_length) 'MaxRowLength'
    FROM   
        sys.columns c
    INNER JOIN 
        sys.tables t ON c.object_id = t.object_id
    WHERE
        c.user_type_id NOT IN (98, 165, 167, 231)  -- sql_variant, varbinary, varchar, nvarchar
    GROUP BY 
        t.name
)
SELECT *
FROM TableRowSizes
WHERE MaxRowLength > 8060
ORDER BY MaxRowLength DESC

Это не означает, что ваши строки фактически используют больше 8060 байт - просто суммируется возможный максимальный размер для каждого столбца.

Если вы хотите определить фактический используемый в настоящее время размер, вы, вероятно, можете сделать что-то подобное, изучив функцию DATALENGTH(colname)(вместо использования теоретического максимального значения из sys.columns)

Обновление: добавило предложение WHERE в мой CTE SELECT на основе ответа gbn - эти типы не должны использоваться при определении, еслистрока потенциально нарушает ограничение размера в 8060 байт.

3 голосов
/ 02 сентября 2011

Строки могут нарушать ограничение в 8060 байт, поскольку столбцы varchar / nvarchar могут переполнить .

Вы получите предупреждение, но оно разрешено.

Если вы нарушаетеограничение в 8060 байт для столбцов фиксированной длины, тогда вам нужно разделить по вертикали (например, таблицы 1: 1).

Обратите внимание, что ваш новый столбец int не идет "в конце": структура на дискечетко определены, и данные будут перемещены для размещения нового поля фиксированной длины: Один Два

...