2016-12-01 49 views
0

如果它是一个常规数据库,我可以简单地使用这个查询来获取所有表名和它们的数据库列名的列表。如何在SQL 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 

但现在我需要连接到链接服务器数据库,因此'使用'不能使用。 还有别的办法吗?

+3

在select语句中完全限定您的表。 '[linkedserver]。[databasename]。[dbo]。[tablename]' –

+0

但是你应该别名你的表。 3(和4)部分命名在选择列表中已弃用。 –

+0

目的是一次列出一个链接服务器数据库的每个表的每个列名。 WEI_DBA能让你更具体地了解你的答案吗? – user3486647

回答

1

在您的FROMJOIN中完全限定您的链接服务器,并为它们加上别名。

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 
+0

谢谢,但我收到此消息: Msg 7399,级别16,状态1,行1 链接服务器“FBSample_test_ODBC”的OLE DB提供程序“MSDASQL”报告了错误。提供者没有提供任何关于错误的信息。 消息7312,级别16,状态1,行1 链接服务器“FBSample_test_ODBC”的OLE DB提供程序“MSDASQL”的架构或目录的使用无效。提供了一个四部分名称,但提供程序不公开必要的接口以使用目录或模式。 – user3486647

+0

我未选中MSDASQL属性中的“零级别”,但仍然是相同的错误。 – user3486647

+0

@ user3486647我在猜测2件事情之一...... 1您正在将sql服务作为低权限帐户运行,或者2因为您使用ODBC连接器,所以必须使用'OPENQUERY'。看看这个视频.... https://youtu.be/BtyMQsE8pvY – scsimon

0

要在@ 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 
相关问题