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

我想查找所有数据库中所有表中的所有列名称。 有没有可以为我做的查询? 数据库是Microsoft SQL Server 2000。

尝试这个:

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 

或者更多的细节:

 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 

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

 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) 

编辑 SQL Server 2000版本

 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) 

编辑
基于一些意见,这里是一个使用sp_MSforeachdb的版本:

 sp_MSforeachdb 'select ''?'' AS DatabaseName, o.name AS TableName,c.name AS ColumnName from sys.columns c inner join ?.sys.objects o on c.object_id=o.object_id --WHERE ''?'' NOT IN (''master'',''msdb'',''tempdb'',''model'') order by o.name,c.column_id' 
 SELECT * FROM information_schema.columns WHERE column_name = 'My_Column' 

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

为什么不使用

 Select * From INFORMATION_SCHEMA.COLUMNS 

你可以使它具体的数据库

 Select * From DBNAME.INFORMATION_SCHEMA.COLUMNS 

尝试下面的查询

 DECLARE @Query VARCHAR(max) SELECT @Query = 'USE ? SELECT ''?'' AS DataBaseName, sys.columns.name AS ColumnName , sys.tables.name AS TableName , schema_name (sys.tables.schema_Id) AS schemaName FROM sys.columns JOIN sys.tables ON sys.columns.object_id = sys.tables.object_id WHERE sys.columns.name = ''id'' ' EXEC SP_MSFOREACHDB @Query 

从所有数据库中提供包含ID列的表的列表。

用户@KM说最好的答案。

我使用这个:

 Declare @Table_Name VarChar(100) ,@Column_Name VarChar(100) Set @Table_Name = '' Set @Column_Name = '' Select RowNumber = Row_Number() Over( PARTITION BY T.[Name] Order By T.[Name],C.column_id ), SCHEMA_NAME( T.schema_id ) As SchemaName , T.[Name] As Table_Name , C.[Name] As Field_Name , sysType.name , C.max_length , C.is_nullable , C.is_identity , C.scale , C.precision From Sys.Tables As T Left Join Sys.Columns As C On ( T.[Object_Id] = C.[Object_Id] ) Left Join sys.types As sysType On ( C.user_type_id = sysType.user_type_id ) Where ( Type = 'U' ) And ( C.Name Like '%' + @Column_Name + '%' ) And ( T.Name Like '%' + @Table_Name + '%' ) 

通常我会尽我所能避免使用游标,但是下面的查询会为您提供所需的一切:

 --Declare/Set required variables DECLARE @vchDynamicDatabaseName AS VARCHAR(MAX), @vchDynamicQuery As VARCHAR(MAX), @DatabasesCursor CURSOR SET @DatabasesCursor = Cursor FOR --Select * useful databases on the server SELECT name FROM sys.databases WHERE database_id > 4 ORDER by name --Open the Cursor based on the previous select OPEN @DatabasesCursor FETCH NEXT FROM @DatabasesCursor INTO @vchDynamicDatabaseName WHILE @@FETCH_STATUS = 0 BEGIN --Insert the select statement into @DynamicQuery --This query will select the Database name, all tables/views and their columns (in a comma delimited field) SET @vchDynamicQuery = ('SELECT ''' + @vchDynamicDatabaseName + ''' AS ''Database_Name'', B.table_name AS ''Table Name'', STUFF((SELECT '', '' + A.column_name FROM ' + @vchDynamicDatabaseName + '.INFORMATION_SCHEMA.COLUMNS A WHERE A.Table_name = B.Table_Name FOR XML PATH(''''),TYPE).value(''(./text())[1]'',''NVARCHAR(MAX)'') , 1, 2, '''') AS ''Columns'' FROM ' + @vchDynamicDatabaseName + '.INFORMATION_SCHEMA.COLUMNS B WHERE B.TABLE_NAME LIKE ''%%'' AND B.COLUMN_NAME LIKE ''%%'' GROUP BY B.Table_Name Order BY 1 ASC') --Print @vchDynamicQuery EXEC(@vchDynamicQuery) FETCH NEXT FROM @DatabasesCursor INTO @vchDynamicDatabaseName END CLOSE @DatabasesCursor DEALLOCATE @DatabasesCursor GO 

我在主查询中添加了一个where子句(例如:B.TABLE_NAME LIKE''%%''和B.COLUMN_NAME LIKE''%%'),以便您可以search特定的表和/或列。

更好的方式给你

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

对于像我这样在数据库服务器上整理好乐趣的人,KM的解决scheme稍作改进。

 DECLARE @SQL varchar(max)='' SELECT @SQL=@SQL+'UNION select '''+d.name +'.''+sh.name+''.''+o.name COLLATE SQL_Latin1_General_CP1_CI_AS,c.name COLLATE SQL_Latin1_General_CP1_CI_AS,c.column_id from '+d.name +'.sys.columns c inner join sys.objects o on c.object_id=o.object_id INNER JOIN 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) 

(仍然希望我们能find一种方法来做到这一点,可以包装成一个视图。)

对大家:感谢所有的post和评论有些是好的,但有些更好。

第一个大脚本是好的,因为它是提供所需的。 最快和最详细的是从INFORMATION_SCHEMA.COLUMNS中select一个build议。

我的需要是find大致相同的名称和几个数据库的所有错误列。所以,我做了我的两个版本(见下文)…下面的脚本中的任何一个工作,并在几秒钟内交付货物。

在这个链接上的其他post中的假设是,第一个代码示例可以成功地用于每个数据库,对我来说是不可取的。 这是因为信息是在特定的数据库中,并且“fedb”的简单使用不会产生正确的结果,所以根本不会给出访问权限。 所以这就是为什么我用CURSOR来收集数据库而忽略那些脱机的,在这种情况下,这是一个实用程序脚本,这是一个很好的用法。

底线,我读了大家的post,整理了post中的所有更正,做出了两个非常雄辩的脚本,从别人的好作品。 我在下面列出,并且还将脚本文件放置在OneDrive.com的公用文件夹中,您可以通过以下链接访问它: http : //1drv.ms/1vr8yNX

请享用 ! 汉克·弗里曼

高级 – SQL Server DBA – 数据架构师

试试他们分开…

 --------------------------- --- 1st example (works) --- --------------------------- Declare @DBName sysname ,@SQL_String1 nvarchar(4000) ,@SQL_String2 nvarchar(4000) ,@ColumnName nvarchar(200) --set @ColumnName = 'Course_ID' -------- Like Trick -------- -- IF you want to add more the @ColumnName so it looks like Course_ID,CourseID -- then add an additional pairing of +''','''+'NewColumnSearchIDValue' ---------------------------- set @ColumnName = 'Course_ID' +''','''+'CourseID' --select @ColumnName ----- Declare @Column_Info table ( [DatabaseName] nvarchar(128) NULL, [ColumnName] sysname NULL, [ObjectName] nvarchar(257) NOT NULL, [ObjectType] nvarchar(60) NULL, [DataType] nvarchar(151) NULL, [Nullable] varchar(8) NOT NULL, [MiscInfo] nvarchar(MAX) NOT NULL ) -------------- Begin set @SQL_String2 = 'SELECT DB_NAME() as ''DatabaseName'', 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 into ##Temp_Column_Info 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 -------------------------------------------- --- DBA - Hank 12-Feb-2015 added this specific where statement -- where Upper(s.name) like ''COURSE%'' -- where Upper(s.name) in (''' + @ColumnName + ''') -- where Upper(s.name) in (''cycle_Code'') -- ORDER BY sh.name+''.''+o.name,s.column_id order by 1,2' -------------------- Declare DB_cursor CURSOR FOR SELECT name FROM sys.databases --select * from sys.databases WHERE STATE = 0 -- and Name not IN ('master','msdb','tempdb','model','DocxPress') and Name not IN ('msdb','tempdb','model','DocxPress') Open DB_cursor Fetch next from DB_cursor into @DBName While @@FETCH_STATUS = 0 begin --select @DBName as '@DBName'; Set @SQL_String1 = 'USE [' + @DBName + ']' set @SQL_String1 = @SQL_String1 + @SQL_String2 EXEC sp_executesql @SQL_String1; -- insert into @Column_Info select * from ##Temp_Column_Info; drop table ##Temp_Column_Info; Fetch next From DB_cursor into @DBName end CLOSE DB_cursor; Deallocate DB_cursor; --- select * from @Column_Info order by 2,3 ---------------------------- end --------------------------- Below is the Second script.. --------------------------- --- 2nd example (works) --- --------------------------- -- This is by far the best/fastes of the lot for what it delivers. --Select * into dbo.hanktst From Master.INFORMATION_SCHEMA.COLUMNS --FileID: SCRIPT_Get_Column_info_(INFORMATION_SCHEMA.COLUMNS).sql ---------------------------------------- --FileID: SCRIPT_Get_Column_info_(INFORMATION_SCHEMA.COLUMNS).sql -- Utility to find all columns in all databases or find specific with a like statement -- Look at this line to find a: --> set @SQL_String2 = ' select * into ##Temp_Column_Info.... ---------------------------------------- --- SET NOCOUNT ON begin Declare @hanktst TABLE ( [TABLE_CATALOG] NVARCHAR(128) NULL ,[TABLE_SCHEMA] NVARCHAR(128) NULL ,[TABLE_NAME] sysname NOT NULL ,[COLUMN_NAME] sysname NULL ,[ORDINAL_POSITION] INT NULL ,[COLUMN_DEFAULT] NVARCHAR(4000) NULL ,[IS_NULLABLE] VARCHAR(3) NULL ,[DATA_TYPE] NVARCHAR(128) NULL ,[CHARACTER_MAXIMUM_LENGTH] INT NULL ,[CHARACTER_OCTET_LENGTH] INT NULL ,[NUMERIC_PRECISION] TINYINT NULL ,[NUMERIC_PRECISION_RADIX] SMALLINT NULL ,[NUMERIC_SCALE] INT NULL ,[DATETIME_PRECISION] SMALLINT NULL ,[CHARACTER_SET_CATALOG] sysname NULL ,[CHARACTER_SET_SCHEMA] sysname NULL ,[CHARACTER_SET_NAME] sysname NULL ,[COLLATION_CATALOG] sysname NULL ,[COLLATION_SCHEMA] sysname NULL ,[COLLATION_NAME] sysname NULL ,[DOMAIN_CATALOG] sysname NULL ,[DOMAIN_SCHEMA] sysname NULL ,[DOMAIN_NAME] sysname NULL ) Declare @DBName sysname ,@SQL_String2 nvarchar(4000) ,@TempRowCnt varchar(20) ,@Dbug bit = 0 Declare DB_cursor CURSOR FOR SELECT name FROM sys.databases WHERE STATE = 0 -- and Name not IN ('master','msdb','tempdb','model','DocxPress') and Name not IN ('msdb','tempdb','model','DocxPress') Open DB_cursor Fetch next from DB_cursor into @DBName While @@FETCH_STATUS = 0 begin set @SQL_String2 = ' select * into ##Temp_Column_Info from [' + @DBName + '].INFORMATION_SCHEMA.COLUMNS where UPPER(Column_Name) like ''COURSE%'' ;' if @Dbug = 1 Select @SQL_String2 as '@SQL_String2'; EXEC sp_executesql @SQL_String2; insert into @hanktst select * from ##Temp_Column_Info; drop table ##Temp_Column_Info; Fetch next From DB_cursor into @DBName end select * from @hanktst order by 4,2,3 CLOSE DB_cursor; Deallocate DB_cursor; set @TempRowCnt = (select cast(count(1) as varchar(10)) from @hanktst ) Print ('Rows found: '+ @TempRowCnt +' end ...') end -------- 

一些小的改进

– >以前的答案没有显示所有结果

– >可以通过设置列名variables来过滤列名称

 DECLARE @columnname nvarchar(150) SET @columnname='' DECLARE @SQL varchar(max) SET @SQL='' SELECT @SQL=@SQL+'UNION select '''+d.name+'.''+sh.name+''.''+o.name COLLATE SQL_Latin1_General_CP1_CI_AS as name,c.name COLLATE SQL_Latin1_General_CP1_CI_AS as columnname,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 where c.name like ''%'+@columnname+'%'' and sh.name<>''sys'' ' FROM sys.databases d SELECT @SQL=RIGHT(@SQL,LEN(@SQL)-5)+'order by 1,3' --print @SQL EXEC (@SQL)