Этот запрос здесь определит, какие таблицы потенциально опасны и имеют максимальный возможный размер строки, который может превышать 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 байт.