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

27 浏览
0 Comments

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

我想找到所有数据库中所有表格的所有列名。有没有一种查询可以帮我做到这一点?

0
0 Comments

在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中查找所有数据库中所有表的列名的问题。但是需要注意的是,这种方法在使用时需要根据具体情况选择合适的解决方案。

0
0 Comments

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

问题出现的原因:

这个问题的出现是因为需要在SQL Server中找到所有数据库中所有表的列名,而不仅仅是一个数据库。

解决方法:

要解决这个问题,可以使用以下步骤:

1. 首先,我们需要设置当前数据库名称,使用USE [db_name]语句。这将确保我们在执行查询之前在正确的数据库中。

2. 然后,我们可以使用以下查询来找到指定列名的所有表:

SELECT * 
FROM information_schema.columns 
WHERE column_name = 'My_Column'

这将返回所有具有指定列名的表的信息。请注意,这个查询只会在当前数据库中执行。如果你想要在所有数据库中执行这个查询,你需要在每个数据库中分别执行它。

通过设置当前数据库名称并使用information_schema.columns视图,我们可以找到所有数据库中所有表的列名。这个问题的解决方法是先设置数据库名称,然后使用查询来获取指定列名的所有表的信息。

0
0 Comments

如何在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。如果你的名称中有特殊字符,可以添加方括号。

0