2015-01-09 2 views
1

Как найти таблицы, в которых конкретный столбец не существует. E.g столбец ID нет в таблице Contact, тогда Contact стол будет в результирующем наборе.Найти таблицы, для которых конкретный столбец не существует. Sql server

Я пробовал:

SELECT DISTINCT t.name 
FROM sys.tables t 
INNER join sys.columns C ON c.object_id = t.object_id 
WHERE c.name <> 'ID' 

Но выше запрос вернет всю таблицу, для которой столбец ID присутствует в нем.

+0

Попробуйте [ссылка] (http://stackoverflow.com/questions/133031/how-to-check -if-column-exists-in-sql-server-table), если это помогает – Abhi

+0

@Abhi Mention использовать, чтобы найти ту таблицу, в которой есть определенный столбец. Но в этом случае мне потребовалась полная противоположность. –

+0

Запрос работает для меня, вы хотите, чтобы имя столбца имело значение «ID» или содержало «ID», например, EmpID? – Adil

ответ

1

Может у попробовать этот запрос,

SELECT * FROM sys.tables WHERE type = 'U' AND object_id NOT IN (
SELECT DISTINCT c.object_id FROM sys.columns c WHERE c.name = 'ID') 
+2

Я отмечаю это как ответ, так как таблица с проверкой 'U' –

1
SELECT name 
FROM sys.Tables 
WHERE Object_ID NOT IN (SELECT Object_ID FROM sys.Columns WHERE name = 'ID') 
1

Вам не нужно, чтобы выполнить соединение, вы можете просто добавить подзапрос, который идентифицирует таблицы, которые имеют столбец ID и исключить object_id, используя NOT IN(..the subquery..) :

SELECT DISTINCT t.name 
FROM sys.tables t 
WHERE t.object_id NOT IN (SELECT object_id FROM sys.columns WHERE name = 'id') 

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

1

Один метод с NOT EXISTS:

SELECT OBJECT_SCHEMA_NAME(t.object_id) AS SchemaName 
     , t.name AS TableName 
FROM sys.tables t 
WHERE NOT EXISTS (SELECT * 
        FROM sys.columns c 
        WHERE c.object_id = t.object_id 
          AND c.name = 'ID'); 
1

Попробуйте следующее, перечислены все имена таблиц, не имеющих идентификатор.

SELECT tableName 
FROM  (
      SELECT DISTINCT 
        t.name AS tableName 
       ,c.name AS columnName 
      FROM sys.tables t 
      INNER JOIN sys.columns C 
        ON c.object_id = t.object_id 
     ) AS t 
WHERE columnName NOT IN('ID') 
GROUP BY tableName 
0

Если вы down't хотите увидеть системные таблицы, а затем ..

SELECT DISTINCT OBJECT_NAME(OBJECT_ID) TableName FROM SYS.COLUMNS WHERE NAME <> 'id' 
and OBJECTPROPERTY (OBJECT_ID, 'IsUserTable') = 1 

EXCEPT 

SELECT DISTINCT OBJECT_NAME(OBJECT_ID) TableName FROM SYS.COLUMNS WHERE NAME = 'id' 
+0

@Downvoter: Могу ли я узнать, почему это было опущено? – SouravA

+0

Я не дубликатор, но этот запрос не вернет результаты @Ankush_Madankar. Этот запрос будет включать таблицы с столбцом id, если таблица содержит более одного столбца. –

+0

Значит, вы имеете в виду, что если таблица имеет только один столбец и это 'id', она не будет отображаться? – SouravA

Смежные вопросы