如何在SQL Server中的所有数据库中查找所有表的列名

Sal*_*n A 62 sql t-sql sql-server sql-server-2000 database-schema

我想在所有数据库的所有表找到所有列名.有查询可以帮我吗?该数据库是Microsoft SQL Server 2000.

KM.*_*KM. 91

试试这个:

select 
    o.name,c.name 
    from sys.columns            c
        inner join sys.objects  o on c.object_id=o.object_id
    order by o.name,c.column_id
Run Code Online (Sandbox Code Playgroud)

生成的列名称应该是:选择o.name作为[Table],c.name作为[Column]来自sys.columns c inner join sys.objects o on c.object_id = o.object_id - where c.name ='你要找到的列'按o.name,c.name排序

或者更多细节:

select 
     o.name as [Table], c.name as [Column]
     from sys.columns            c
         inner join sys.objects  o on c.object_id=o.object_id
     --where c.name = 'column you want to find'
     order by o.name,c.name
Run Code Online (Sandbox Code Playgroud)


这里编辑是获取所有数据库中所有列的基本示例:

SELECT
    s.name as ColumnName
        ,sh.name+'.'+o.name AS ObjectName
        ,o.type_desc AS ObjectType
        ,CASE
             WHEN t.name IN ('char','varchar') THEN t.name+'('+CASE WHEN s.max_length<0 then 'MAX' ELSE CONVERT(varchar(10),s.max_length) END+')'
             WHEN t.name IN ('nvarchar','nchar') THEN t.name+'('+CASE WHEN s.max_length<0 then 'MAX' ELSE CONVERT(varchar(10),s.max_length/2) END+')'
            WHEN t.name IN ('numeric') THEN t.name+'('+CONVERT(varchar(10),s.precision)+','+CONVERT(varchar(10),s.scale)+')'
             ELSE t.name
         END AS DataType

        ,CASE
             WHEN s.is_nullable=1 THEN 'NULL'
            ELSE 'NOT NULL'
        END AS Nullable
        ,CASE
             WHEN ic.column_id IS NULL THEN ''
             ELSE ' identity('+ISNULL(CONVERT(varchar(10),ic.seed_value),'')+','+ISNULL(CONVERT(varchar(10),ic.increment_value),'')+')='+ISNULL(CONVERT(varchar(10),ic.last_value),'null')
         END
        +CASE
             WHEN sc.column_id IS NULL THEN ''
             ELSE ' computed('+ISNULL(sc.definition,'')+')'
         END
        +CASE
             WHEN cc.object_id IS NULL THEN ''
             ELSE ' check('+ISNULL(cc.definition,'')+')'
         END
            AS MiscInfo
    FROM sys.columns                           s
        INNER JOIN sys.types                   t ON s.system_type_id=t.user_type_id and t.is_user_defined=0
        INNER JOIN sys.objects                 o ON s.object_id=o.object_id
        INNER JOIN sys.schemas                sh on o.schema_id=sh.schema_id
        LEFT OUTER JOIN sys.identity_columns  ic ON s.object_id=ic.object_id AND s.column_id=ic.column_id
        LEFT OUTER JOIN sys.computed_columns  sc ON s.object_id=sc.object_id AND s.column_id=sc.column_id
        LEFT OUTER JOIN sys.check_constraints cc ON s.object_id=cc.parent_object_id AND s.column_id=cc.parent_column_id
    ORDER BY sh.name+'.'+o.name,s.column_id
Run Code Online (Sandbox Code Playgroud)

编辑 SQL Server 2000版本

DECLARE @SQL varchar(max)
SET @SQL=''
SELECT @SQL=@SQL+'UNION
select 
'''+d.name+'.''+sh.name+''.''+o.name,c.name,c.column_id
from '+d.name+'.sys.columns            c
    inner join '+d.name+'.sys.objects  o on c.object_id=o.object_id
    INNER JOIN '+d.name+'.sys.schemas  sh on o.schema_id=sh.schema_id
'
FROM sys.databases d
SELECT @SQL=RIGHT(@SQL,LEN(@SQL)-5)+'order by 1,3'
--print @SQL
EXEC (@SQL)
Run Code Online (Sandbox Code Playgroud)

编辑
基于一些评论,这里是一个版本使用sp_MSforeachdb:

DECLARE @SQL varchar(8000)
SET @SQL=''
SELECT @SQL=@SQL+'UNION
select 
'''+d.name+'.''+sh.name+''.''+o.name,c.name,c.colid
from '+d.name+'..syscolumns            c
    inner join sysobjects  o on c.id=o.id
    INNER JOIN sysusers  sh on o.uid=sh.uid
'
FROM master.dbo.sysdatabases d
SELECT @SQL=RIGHT(@SQL,LEN(@SQL)-5)+'order by 1,3'
--print @SQL
EXEC (@SQL)
Run Code Online (Sandbox Code Playgroud)

  • 您可以将此示例移植到 SQL Server 2000 吗?在 SQL Server 2000 中没有“sys”对象。用“syscolumns”替换“sys.colums”会有帮助吗? (2认同)
  • 您还可以尝试使用 sp_MSforeachdb 运行原始查询 (2认同)
  • 正如 Chris W 所说,尽管 sp_msforeachdb 和 sp_msforeachtable 没有文档记录,但它们在这里是理想的选择。请查看 http://blogs.techrepublic.com.com/datacenter/?p=395 了解一些详细信息。 (2认同)
  • @Chipmonkey,我修复了这个错误。我将“内部连接 ​​sys.objects”更改为“内部连接?.sys.objects”。如果您的名称中包含特殊字符,请随意添加方括号。 (2认同)
  • @Davos,感谢您的建议,如果您遇到问题,是的,这是解决问题的好方法。我讨厌方括号,如果你需要使用它们,你在命名你的项目时做错了。 (2认同)

Jer*_*emy 24

为什么不用

Select * From INFORMATION_SCHEMA.COLUMNS
Run Code Online (Sandbox Code Playgroud)

您可以使用特定的DB

Select * From DBNAME.INFORMATION_SCHEMA.COLUMNS
Run Code Online (Sandbox Code Playgroud)

  • 所以问题是永恒的,因为这是谷歌的高排名结果。还。我不知道。 (2认同)

小智 22

SELECT * 
FROM information_schema.columns 
WHERE column_name = 'My_Column'
Run Code Online (Sandbox Code Playgroud)

您必须USE [db_name]在此查询之前设置当前数据库名称.

  • 这个问题专门要求*所有数据库*,而不仅仅是一个。 (3认同)

小智 7

更适合你的方式

sp_MSForEachDB @command1='USE ?;
SELECT 
    Table_Catalog 
    ,Table_Schema
    ,Table_Name
    ,Column_Name
    ,Data_Type
    ,Character_Maximum_Length
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME like ''%ColumnNameHere%'''
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一对我有用的。KM 的版本只是从系统表返回列。还必须在 ? 周围放一个 [] 在 USE 语句中用空格覆盖数据库名称 (2认同)