与表列表关联数据库名称(Associate Database Name with Table Lis

2019-09-17 16:27发布

这是没有问题的列表与服务器上的架构中的所有表

SELECT SCHEMA_NAME(schema_id), name FROM sys.tables

我怎么能确定哪个数据库表驻留在?

Answer 1:

SYS.TABLES存在于所有的数据库,所以我不继的事实,你不知道你是在分贝。你可以运行DB_NAME(DB_ID())来获取数据库名称

SELECT  DB_NAME(DB_ID()),SCHEMA_NAME(schema_id), name FROM sys.tables

但在这种情况下,DB_NAME(DB_ID())将返回相同的值的每一行

这样做对所有的数据库,你可以这样做

EXEC sp_msforeachdb 'use  [?] SELECT  ''?'',SCHEMA_NAME(schema_id), name 
                                  FROM sys.tables'

当然,你可以转储到一个表,以及

CREATE TABLE #output (DatabaseName VARCHAR(1000), 
                   SchemaName VARCHAR(1000), 
                  TableName VARCHAR(1000))

INSERT #output
EXEC sp_msforeachdb 'use  [?] SELECT  ''?'',SCHEMA_NAME(schema_id), name 
                                  FROM sys.tables'

SELECT * FROM #output

正如仅供参考,sp_msforeachdb PROC是未公开的,你不应该使用它的生产代码,可以快速找到优良,生产代码滚你自己的这个PROC版本

另见阿龙贝特朗的帖子在这里:

  • 制作一个更可靠,更灵活sp_MSforeachdb
  • 每个数据库的SQL Server中的上下文中执行命令


Answer 2:

我就遇到了这个问题,当我创建查询,我想能够针对不同的数据库我的服务器上运行,并包括其他数据库的名称名称,没有硬编码到查询。

查询基本上是这样的:

SELECT DB_NAME() db_name
     , SCHEMA_NAME(schema_id) schema_name
     , name table_name
  FROM OtherDB.sys.tables   --The OtherDB is to specify that I am running
                            --this for a different database than the one
                            --I'm logged in to for my current session.

问题是,即使我指定OtherDB.sys.tables在FROM子句中, DB_NAME()总是返回当前数据库我在是的,我可以把一个USE OtherDB开头,但它似乎应该有另一个方式。 我通过各种SYS鉴于我能找到看去,却再也找不到任何可以连接sys.databasessys.tables

我最终发现是SQL Server的INFORMATION_SCHEMA.TABLES该视图包括数据库名称作为第一列(被称为TABLE_CATAOLG )。

SELECT TABLE_CATALOG
     , TABLE_SCHEMA
     , TABLE_NAME
     , TABLE_TYPE
  FROM INFORMATION_SCHEMA.TABLES

这些观点,你可以轻松地比较表中两个数据库:

SELECT a.TABLE_CATALOG
     , a.TABLE_SCHEMA
     , a.TABLE_NAME
     , a.TABLE_TYPE
     , b.TABLE_CATALOG
     , b.TABLE_SCHEMA
     , b.TABLE_NAME
     , b.TABLE_TYPE
  FROM OneDatabase.INFORMATION_SCHEMA.TABLES a
  FULL OUTER JOIN TwoDatabase.INFORMATION_SCHEMA.TABLES b 
    ON a.TABLE_SCHEMA = b.TABLE_SCHEMA
   AND a.TABLE_NAME = b.TABLE_NAME

如果数据库对链接,你应该能够使用所有四个部分来使用此查询单独的服务器完全限定表名 。



Answer 3:

如果你的目的只是为了包括当前的数据库名,为什么不干脆:

SELECT DB_NAME(), SCHEMA_NAME(schema_id), name FROM sys.tables;

如果你的意图是从所有数据库中拉都的名字,我个人更喜欢动态SQL这样的,而不是sp_msforeachdb

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += CHAR(13) + CHAR(10) + 'UNION ALL 
    SELECT ''' + name + ''', s.name, t.name
    FROM ' + QUOTENAME(name) + '.sys.tables AS t
    INNER JOIN ' + QUOTENAME(name) + '.sys.schemas AS s
    ON t.schema_id = s.schema_id'
    FROM sys.databases
    WHERE database_id > 4;

SET @sql = STUFF(@sql, 1, 13, '');

PRINT @sql;

-- EXEC sp_executesql @sql;


文章来源: Associate Database Name with Table List