Запрос, чтобы найти все таблицы со столбцами даты в нем

Кто-нибудь может сообщить мне запрос, чтобы найти все таблицы, в которых есть столбцы даты.

Спасибо

11.12.2008 04:00:52
6 ОТВЕТОВ

При этом используется INFORMATION_SCHEMA для таблиц в текущей базе данных.
Протестировано в SQL Server 2008.

    select distinct c.TABLE_NAME     
    from INFORMATION_SCHEMA.COLUMNS as c
    where c.DATA_TYPE = 'datetime'

Еще один запрос для SQL 2005/2008 с использованием системных представлений:

select tbl.name as 'Table', c.name as 'Column Name', t.name as 'Type'
from sys.columns as c
inner join sys.tables as tbl
on tbl.object_id = c.object_id
inner join sys.types as t
on c.system_type_id = t.system_type_id
where t.name in ('datetime', 'date')
order by tbl.name
17
11.12.2008 04:23:31

Это должно сработать, просто добавьте дополнительные типы, если они вам нужны:

select
    so.name table_name
   ,sc.name column_name
   ,st.name data_type
from sysobjects so
inner join syscolumns sc on (so.id = sc.id)
inner join systypes st on (st.type = sc.type)
where so.type = 'U'
and st.name IN ('DATETIME', 'DATE', 'TIME', 'SMALLDATETIME')

редактировать: это также работает в Sybase и любых других вариантах T-SQL.

20
4.02.2020 00:06:06
Легко изменяется, чтобы найти все таблицы с определенным именем столбца. (Вот как я сюда попал.) Спасибо!
caseyboardman 5.01.2010 20:15:27
Большое спасибо! Для SQL 2008 вы хотели бы обновить предложение WHERE так, чтобы оно читалось как AND st.name IN ('DATETIME', 'DATE', 'TIME', 'DATETIME2', 'SMALLDATETIME', 'DATETIMEOFFSET')
dividius 27.09.2011 08:16:05
Ой, получается, что sysobject и т. Д. Были заменены в SQL 2005 на sys.object, sys.columns и т. Д. Я обнаружил, что приведенный выше запрос совершенно ненадежен в SQL 2008. Ответ @RobS ниже предоставляет правильные результаты (обновленный, чтобы включить полный спектр типов).
dividius 27.09.2011 12:21:07
@dividus - когда вы говорите «ненадежный», что вы имеете в виду? Разве вы не можете просто заменить sysobjectsс sys.objects?
ninesided 3.10.2011 08:01:42
Есть ли способ изменить этот SQL, чтобы показать имена полей даты, когда они находятся до определенной даты?
Anton Hughes 12.06.2013 13:18:46

Я знаю, что это старый вопрос, но я нашел его в поиске аналогичного решения проблемы.
Это то, что я использую:

SELECT
    DISTINCT OBJECT_NAME(col.OBJECT_ID) AS [TableName]
FROM
    sys.all_columns col
    INNER JOIN sys.types typ
    ON col.user_type_id = typ.user_type_id
WHERE
    col.user_type_id IN (61)

Вы можете найти все основные типы данных здесь: http://www.sqlservercurry.com/2008/06/find-all-columns-with-varchar-and.html

Если вы хотите найти все столбцы определенного типа в определенной таблице, просто используйте это:

SELECT
    OBJECT_NAME(col.OBJECT_ID) AS [TableName]
    ,col.[name] AS [ColName]
    ,typ.[name] AS [TypeName]
FROM
     sys.all_columns col
     INNER JOIN sys.types typ
     ON col.user_type_id = typ.user_type_id
WHERE
    col.user_type_id IN (61)
    AND
    OBJECT_NAME(col.OBJECT_ID) = 'TABLE_NAME'

Может, кто-нибудь найдет это полезным :)

0
1.03.2012 08:36:27

Небольшое улучшение запроса RobS выше. Этот также возвращает столбец с именем схемы.

select s.name as 'SchemaName',
tbl.name as 'Table', c.name as 'Column Name', t.name as 'Type'
from sys.columns as c
inner join sys.tables as tbl
on tbl.object_id = c.object_id
inner join sys.types as t
on c.system_type_id = t.system_type_id
inner join sys.schemas s
on  tbl.schema_id = s.schema_id
where t.name in ('datetime', 'date')
order by s.name, tbl.name
2
25.06.2012 14:57:18

Вот еще одна пьеса из ответа RobS, которая получит все различные типы форматов даты и времени с момента введения даты, даты и времени2 и времени, которые были введены.

SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE LIKE '%date%' OR DATA_TYPE LIKE '%time%'

Протестировано в SQL Server 2012 и 2014, но должно работать в 2003, 2005, 2008 и многих соединениях ODBC.

9
5.07.2017 15:49:38

Вот протестированный код ниже:

SELECT DISTINCT(TABLE_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
DATA_TYPE='datetime'

Для нескольких типов данных вы можете использовать код ниже:

SELECT DISTINCT(TABLE_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
DATA_TYPE IN ('datatype1','datatype2')
1
20.08.2019 10:43:51
да, мы можем найти несколько типов данных, используя этот код
Divyesh Jani 19.12.2019 05:27:08