如何在 SQL Server 中列出链接服务器数据库的所有表和列名称?

use*_*647 8 sql-server linked-server

如果它是一个常规数据库,我可以简单地使用这个查询来获取数据库的所有表名及其列名的列表。

use [my_database_name]
GO

SELECT sys.tables.name AS Table_Name, 
       sys.columns.name AS Column_Name, 
       sys.columns.max_length, 
       (schema_id) As Schema_name

FROM sys.tables
    INNER JOIN sys.columns 
        ON sys.tables.OBJECT_ID=sys.columns.object_id

ORDER BY schema_name, sys.tables.name, sys.columns.name
Run Code Online (Sandbox Code Playgroud)

但现在我需要连接到链接服务器数据库,因此无法使用“使用”。还有其他方法吗?

小智 7

系统存储过程sp_tables用于列出当前服务器的当前数据库中可用的表。您可以将sp_tables_ex用于链接服务器。以下返回指定服务器中可用表的列表:

EXEC sp_tables_ex @table_server = 'MYSQL_DB'
Run Code Online (Sandbox Code Playgroud)


Nic*_*lay 6

稍微扩展@scsimon的答案......

(schema_id) As Schema_name不是很有用,因为它实际上是一个 ID。要获取具有实际模式名称的所有表(及其列)的列表,可以使用:

SELECT s.name AS schema_name
      ,t.name AS table_Name
      ,c.name AS column_Name
    --,c.max_length
FROM [SERVER].[DB].sys.tables t
JOIN [SERVER].[DB].sys.schemas s ON t.schema_id = s.schema_id
JOIN [SERVER].[DB].sys.columns c ON t.object_id = c.object_id
--WHERE s.name = 'dbo'
ORDER BY s.name, t.name, c.name
Run Code Online (Sandbox Code Playgroud)


scs*_*mon 3

完全限定您的FROM和中的链接服务器JOIN,并为它们指定别名。

SELECT lst.name AS Table_Name, 
       lsc.name AS Column_Name, 
       lsc.max_length, 
       (schema_id) As Schema_name

FROM [SERVER].[DB].[sys].[tables] lst
    INNER JOIN [SERVER].[DB].[sys].[columns] lsc
        ON lst.OBJECT_ID=lsc.object_id

ORDER BY schema_name, lst.name, lsc.name
Run Code Online (Sandbox Code Playgroud)