2014-10-20 2 views
0

Мне нужно убедиться, что все столбцы, содержащие имена пользователей, имеют максимальную длину в 140 символов. Я довольно новичок в SQL, и мне любопытно, как вы это сделаете.Искать все таблицы для столбца И вернуть максимальную длину для столбцов

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

SELECT 
    t.name AS 'Table Name', 
    c.name AS 'Column Name', 
    max(len(%COLUMN_NAME%)) AS 'Max Length' 
FROM sys.tables AS t 
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID 
WHERE c.name LIKE '%COLUMN_NAME%' 
ORDER BY 'Table Name' 

Решено. Благодаря!

+0

Если вы новичок в sql, я задаюсь вопросом, почему вам нужен такой apporach. Почему бы вам не выбрать правильный столбец (и) соответствующих таблиц, а не использовать 'sys.tables'? –

+0

Вам нужна максимально возможная длина значения столбца (которая также присутствует в 'sys.columns') или длина самого длинного фактического значения (что требует построения динамического запроса)? –

+0

@TimSchmelter У нас есть много таблиц и немало возможных вариантов имен столбцов. Мне нужно найти экземпляр «userid», например, а также каждый экземпляр «changedby», «modifiedby», «% verbed% by» ... Я регулярно использую запрос, чтобы найти подходящие таблицы, но я взяв это за опыт, чтобы добавить число символов max в запрос. Я думаю, может быть, эта техника будет полезна для других типов запросов в будущем. – Defpotec2020

ответ

0

Данные, о которых идет речь, являются max_length в sys.columns, с дополнительным завихрением, которое мы должны обрабатывать MAX и типы Юникода специально. Вы также хотите оставить системные таблицы.

SELECT 
    t.name AS 'Table Name', 
    c.name AS 'Column Name', 
    CASE WHEN tp.[name] IN ('nchar', 'nvarchar') AND c.max_length <> -1 THEN c.max_length/2 ELSE c.max_length END AS 'Max Length' 
FROM sys.tables AS t 
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID 
INNER JOIN sys.types tp ON c.system_type_id = tp.system_type_id 
WHERE t.is_ms_shipped = 0 AND c.name LIKE '%name%' 
ORDER BY t.name 

Если max_length = -1 типа является одним из CHAR(MAX) типов (и для этой конкретной проблемы, это означает, что он достаточно долго).

0

Если задание «Убедитесь, что все такие столбцы имеют максимальную длину 140», тогда вы хотите, чтобы ваш результирующий набор был работоспособным. Здесь функция Max не должна вступать в игру, но вам нужно, чтобы предложение where для фильтрации элементов, которые не нуждаются в действии.

Это проверяет неравенство, но если вы ищете «по крайней мере, 140 символов», сделать первое условие < 140, а не != 140. Критерии в этом порядке помогают сделать запрос менее дорогостоящим, поскольку операторы равенства по целым числам быстрее, чем любой оператор LIKE.

+0

Спасибо вам большое! – Defpotec2020

+0

Порядок предложений в 'WHERE' не имеет значения - оптимизатор все равно изменит их порядок (и это в целом справедливо, за исключением того, что это' CASE', поскольку это заставляет порядок оценки). Вы можете проверить, что планы выполнения для обеих версий одинаковы. –

+0

Я понимаю, что в академическом плане этого не должно быть, но у меня есть два плана запросов со стоимостью 0,64 ... и 0,42, которые могли бы сказать иначе. Это были экземпляры SQL 2008 R2 (SP2). –