如何在SQL Server中查找所有数据库中所有表的列名
在SQL Server中查找所有数据库中所有表的列名的问题出现的原因是,使用Select * From INFORMATION_SCHEMA.COLUMNS
语句只能查询当前数据库的列名,而无法查询其他数据库的列名。因此,如果需要查询所有数据库的列名,就需要找到解决方法。
解决方法是使用以下语句:Select * From DBNAME.INFORMATION_SCHEMA.COLUMNS
,其中DBNAME是数据库的名称。通过指定数据库名称,可以查询指定数据库中所有表的列名。
然而,这种解决方法仍然有一个问题,就是在函数内部使用时,函数本身无法提前知道数据库的名称。因此,为了解决这个问题,可以使用SQL Server 2000中的一些函数,如OPENQUERY()
和EXEC('sql string here')
,通过动态生成SQL语句的方式来查询所有数据库的列名。
总之,通过上述方法,可以解决在SQL Server中查找所有数据库中所有表的列名的问题。但是需要注意的是,这种方法在使用时需要根据具体情况选择合适的解决方案。
如何在SQL Server中找到所有数据库中所有表的列名?
问题出现的原因:
这个问题的出现是因为需要在SQL Server中找到所有数据库中所有表的列名,而不仅仅是一个数据库。
解决方法:
要解决这个问题,可以使用以下步骤:
1. 首先,我们需要设置当前数据库名称,使用USE [db_name]
语句。这将确保我们在执行查询之前在正确的数据库中。
2. 然后,我们可以使用以下查询来找到指定列名的所有表:
SELECT * FROM information_schema.columns WHERE column_name = 'My_Column'
这将返回所有具有指定列名的表的信息。请注意,这个查询只会在当前数据库中执行。如果你想要在所有数据库中执行这个查询,你需要在每个数据库中分别执行它。
通过设置当前数据库名称并使用information_schema.columns
视图,我们可以找到所有数据库中所有表的列名。这个问题的解决方法是先设置数据库名称,然后使用查询来获取指定列名的所有表的信息。
如何在SQL Server中查找所有数据库中所有表的列名?
尝试这个:
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 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
或者更详细一些:
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'
这个版本只适用于当前数据库,不能在所有数据库中运行。
你可以尝试使用sp_MSforeachdb来运行原始查询。
正如Chris W所说,虽然它们没有文档,但是sp_MSforeachdb和sp_MSforeachtable在这里是理想的。在blogs.techrepublic.com.com/datacenter/?p=395中查看详细信息。
SQL Server 2000中没有varchar(max)。
我相信你第二个代码块“更详细”是错误的。你将sys.types与system_type_id连接在一起,应该使用user_type_id。当我运行你的代码时,当数据类型是geography时,我得到了多个相同字段的结果。它还返回了hierarchyid和geometry类型的结果。此外,BOL指示正确的字段连接在这里:msdn.microsoft.com/en-us/library/ms188021.aspx。
你是对的。它也会对nvarchar和nchar造成问题。这是一个很旧的代码片段,早在这些数据类型出现之前就存在。
_MSforeachdb版本对我来说不起作用...结果因我当前使用的数据库不同而有所不同。我在每个语句的开头添加了"USE [?];"来解决这个问题。这可能是因为我使用的是SQL Server 2012,我没有旧版本进行比较。
我修复了这个错误。我将内部连接sys.objects更改为内部连接?.sys.objects。如果你的名称中有特殊字符,可以添加方括号。