Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在数据库中查找表_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 在数据库中查找表

Sql 在数据库中查找表,sql,sql-server,tsql,Sql,Sql Server,Tsql,在Microsoft SQL Server中 我需要找到列名和表名所在的数据库和服务器 我知道一个表名、列名 如何找到表和列所在的数据库?只指定列名 SELECT t.name AS table_name, SCHEMA_NAME(schema_id) AS schema_name, c.name AS column_name FROM sys.tables AS t INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID WHERE c.n

在Microsoft SQL Server中

我需要找到列名和表名所在的数据库和服务器

我知道一个表名、列名


如何找到表和列所在的数据库?

只指定列名

SELECT t.name AS table_name, SCHEMA_NAME(schema_id) AS schema_name,
 c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%Column_Name%'
ORDER BY schema_name, table_name;

在SqlServer中,如果存在表和列,则此查询将返回一行

select * from sysobjects T
JOIN syscolumns C ON T.id = C.id
where c.name = 'COLUMNNAME' and t.name = 'TABLENAME'

您需要遍历所有数据库才能执行此操作:

IF OBJECT_ID('tempdb..#DBNames', 'U') IS NOT NULL
      DROP TABLE #DBNames

    Create Table #DBNames (
        DBName  varchar(256)
    )
    Insert  #DBNames
    Select  name
    From    sys.databases
    Where   owner_sid <> 1

    Declare @DBName nvarchar(256)
            ,@TableName nvarchar(256)
            ,@ColumnName nvarchar(256)
            ,@sql nvarchar(2000)

    Select  @TableName = 'YourTableName'
            ,@ColumnName = 'YourColumnName'

    Declare SearchForDBTable Cursor For
    Select  DBName
    From    #DBNames

    Open SearchForDBTable
    Fetch Next From SearchForDBTable Into @DBName

    While @@FETCH_STATUS = 0
    Begin
        Set @sql = 'Select  @DBName DBName
                            ,t.name TableName
                            ,c.name ColumnName
                    From    sys.tables t
                    join    sys.columns c
                        on  t.object_id = c.object_id
                    Where   t.name = @TableName
                        And c.name = @ColumnName'
        exec sp_executesql  @sql
                            ,N'@DBName varchar(256), @TableName varchar(256), @ColumnName varchar(256)'
                            ,@DBName = @DBName
                            ,@TableName = @TableName
                            ,@ColumnName = @ColumnName

    Fetch Next From SearchForDBTable Into @DBName
    End

    Close SearchForDBTable
    Deallocate SearchForDBTable

这里有一个方法。从查询开始,确定当前选定的数据库中是否存在tabe.column:

SELECT db_name()
 from sys.tables ta
  inner join sys.columns co
   on co.object_id = ta.object_id
 where ta.name = 'Users'
  and co.name = 'CreatedOn'
将其转换为仅在找到时生成结果的例程:

IF exists (select 1
            from sys.tables ta
             inner join sys.columns co
              on co.object_id = ta.object_id
            where ta.name = 'Users'
             and co.name = 'CreatedOn')
    PRINT db_name()
然后将其插入未记录但非常有用的系统程序sp_msForEachDB:


这将打印出实例上包含此表和列的每个数据库的名称。

这里有另一种使用信息模式的方法。您可以扩展select语句中的内容,但基本内容如下所示。从SQLServer2005开始,我就一直在使用类似的脚本,这是刚刚使用SQLServer2012编写的

DECLARE @somecolumn VARCHAR(155) = 'name'

SELECT t.TABLE_CATALOG, t.TABLE_NAME, c.Column_name, c.ORDINAL_Position
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.COLUMNS c
ON t.TABLE_NAME = c.TABLE_NAME AND c.COLUMN_NAME = @somecolumn
WHERE t.TABLE_TYPE = 'BASE TABLE'

看看你连接到哪个数据库的查询是有效的?我们谈论的是哪个sql server,MySQL,MSSQL,Oracle?我们需要更多的细节来给你最好的建议,你在看什么?是否有一段代码,或者您正在查看某种数据库浏览器?多个服务器/数据库可能具有相同的表名和列名。您试图解决的问题是什么?在Microsoft SQL server中,用户不知道它在哪个数据库中,所以是哪个sysobjects?@KyleHale如前所述,用户甚至不知道是哪个服务器。这样做了,但我建议使用sp_msForEachDB,所有的数据库游标循环都是这样做的。不需要游标或循环:只需使用sp_msforeachdb。对PhilipSure挥拳,但它没有文档记录,并且有它的问题。@DaveJohnson您是100%正确的,先生。大量的SQL专家已经做了很多测试,表明这可能会丢失整个数据库,并可能会锁定您的服务器。使用msForEachDB时要非常小心。
DECLARE @somecolumn VARCHAR(155) = 'name'

SELECT t.TABLE_CATALOG, t.TABLE_NAME, c.Column_name, c.ORDINAL_Position
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.COLUMNS c
ON t.TABLE_NAME = c.TABLE_NAME AND c.COLUMN_NAME = @somecolumn
WHERE t.TABLE_TYPE = 'BASE TABLE'