Я не буду повторять некоторые другие ответы, но добавлю перспективу производительности. Представления information_schema, как Мартин Смит упоминает в своем ответе, не являются наиболее эффективным источником этой информации, поскольку они должны предоставлять стандартные столбцы, которые необходимо собирать из нескольких базовых источников. Представления sys могут быть более эффективными с этой точки зрения, поэтому, если у вас высокие требования к производительности и вам не нужно беспокоиться о переносимости, вам, вероятно, следует использовать представления sys.
Например, в первом запросе ниже используются information_schema.tables для проверки существования таблицы. Второй использует sys.tables для того же.
if exists (select * from information_schema.tables where table_schema = 'dbo' and table_name = 'MyTable')
print '75% cost';
if exists (select * from sys.tables where object_id = object_id('dbo.MyTable'))
print '25% cost';
Когда вы просматриваете IO для них, первый запрос имеет 4 логических чтения к sysschobjs и sysclsobjs, а второй - нет. Кроме того, первый выполняет два поиска по некластерному индексу и поиск по ключу, а второй - только поиск по одному кластерному индексу. Первый из них стоит примерно в 3 раза больше, чем второй, согласно планам запросов. Если вам приходится делать это много раз в большой системе, например, для времени развертывания, это может привести к проблемам с производительностью. Но это действительно относится только к сильно загруженным системам. Большинство ИТ-систем бизнес-систем не имеют таких проблем с производительностью.
Опять же, их общая стоимость очень мала в отдельности по сравнению с другими запросами в большинстве систем, но если ваша система выполняет много операций такого типа, она может сложиться.