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





Это использует 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
Это должно помочь, просто добавьте дополнительные типы, если они вам нужны:
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.
Большое спасибо! Для SQL 2008 вам нужно обновить предложение WHERE, чтобы оно читалось как И st.name IN ('DATETIME', 'DATE', 'TIME', 'DATETIME2', 'SMALLDATETIME', 'DATETIMEOFFSET')
К сожалению, оказывается, что sysobject и т. д. Были заменены в SQL 2005 на sys.object, sys.columns и т. д. Я обнаружил, что приведенный выше запрос был совершенно ненадежный в SQL 2008. Ответ @RobS ниже дает правильные результаты (обновлено, чтобы включить полный спектр типов).
@dividus - когда вы говорите «ненадежный», что вы имеете в виду? Разве нельзя просто заменить sysobjects на sys.objects?
Есть ли способ изменить этот SQL, чтобы отображать имена полей даты, когда они предшествуют определенной дате?
@AntonHughes не в одном запросе, я не думаю - вам нужно будет начать со списка таблиц и столбцов, которые вас интересуют, а затем использовать немедленное выполнение, чтобы узнать, есть ли какие-либо данные в таблице и столбце в вопросе удовлетворяет вашим требованиям
по крайней мере, в SQL 2014 этот список не включает столбцы, допускающие значения NULL.
пришлось изменить этот join systypes st on (st.xtype = sc.xtype), чтобы исправить smalldatetime в sql2016
Я знаю, что это старый вопрос, но я нашел его в поисках аналогичного решения проблемы. Вот что я использую:
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'
Может быть, кому-то это пригодится :)
Небольшое улучшение запроса 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
Вот еще одна игра с ответом RobS, который получит все различные типы форматов даты и форматов времени с момента введения даты, datetime2 и времени, которые были введены.
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.
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')
Легко изменить, чтобы найти все таблицы с определенным именем столбца. (Так я сюда попал.) Спасибо!