查询以查找包含日期列的所有表

时间:2008-12-11 04:00:53

标签: sql-server-2005 tsql date types

任何人都可以让我知道查询以找到所有具有日期列的表。

由于

6 个答案:

答案 0 :(得分:18)

这应该可以解决问题,只需在需要时添加其他类型:

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')

编辑: 这也适用于Sybase和任何其他T-SQL变体。

答案 1 :(得分:16)

这在当前数据库中的表上使用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

答案 2 :(得分:9)

以下是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连接中运行。

答案 3 :(得分:2)

上面的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

答案 4 :(得分:1)

下面是经过测试的代码:

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')

答案 5 :(得分:0)

我知道这是一个老问题,但我发现它正在寻找类似的问题解决方案 这就是我正在使用的:

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'

Mayby有人会发现它很有用:)