web-dev-qa-db-ja.com

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

しかし、今はリンクサーバーデータベースに接続する必要があるため、「use」は使用できません。別の方法はありますか?

4
user3486647

リンクサーバーを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
1
scsimon

システムストアドプロシージャsp_tablesは、現在のサーバーの現在のデータベースで使用可能なテーブルを一覧表示するために使用されます。リンクサーバーにはsp_tables_exを使用できます。以下は、指定されたサーバーで使用可能なテーブルのリストを返します。

EXEC sp_tables_ex @table_server = 'MYSQL_DB'
1
vadim-info

リストする解決策があります:

declare @temp table
(
    col1 varchar(255),
    col2 varchar(255),
    [name] varchar(255),
    [type] varchar(255),
    col3 varchar(255)
)
insert @temp exec sp_tables_ex 'Your_LinkedServer_Name'
select * from @temp

また、カーソルを開きます。

DECLARE lstTables CURSOR FOR 
        select [name] from @temp
1
Oxana N

@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
1
Nickolay