2016-09-01 9 views
0

私はしばらくデータベースを扱ってきましたが、このようなことを行う必要はありませんでした。ストアドプロシージャの結果がネストされたストアドプロシージャを提供するSQL Serverのネストされたループ

背景 - SQL Serverをリンクサーバー経由でいくつかのアプリケーションの後ろに接続しました。これらのアプリケーションのdb-insideに関するドキュメントはありません。

各リンクサーバーに関するメタデータを記録したいと思います。

sp_columnsは、これらのリンクサーバー上では動作しませんのでご注意)

ステップ1

sp_linkedservers(いくつかの基準を使用してリンクサーバーのリストを取得する):私は考えていたのアプローチは、このようなものです

- > sp_tables_ex(テーブルのリストを取得する)

- >テーブル名に基づいて一時テーブルを作成します(...に挿入)

ステップ2

一時テーブルをループし、各テーブルの

- > sp_columnsは、サーバ、テーブル、列、タイプを連結記録する最終的な宛先表に出力を書き込む...

この疑似システムテーブルは、リンクされたサーバー列に関するメタデータを検索するときに検索できます。

この問題に近づくSQL Serverの方法は何ですか?

EDIT:リンクされたサーバーにFirebirdとProgressのデータベースをODBC接続で追加してください。

+1

正確に問題がどこにあるか説明できる場合は、回答を投稿して回答できます。メタデータを取得するには複数の方法があります(例:リンクされた各サーバー上で直接システム表を読み取ることができます。 – Anton

+0

私は、リンクされたデータベース内のテーブルの内容と関係を理解し​​ようとしています。 – Tuds

答えて

0

あなたの仕事がtablename、列名、それぞれのリンクされたサーバーの列の種類を記録する場合は、これで作業できると思います。

DECLARE @SERVER VARCHAR(100),@QUERY VARCHAR(MAX),@DBASE VARCHAR(100) 
DECLARE @DBNAME TABLE(ID INT IDENTITY(1,1),DBASE VARCHAR(100)) 
DECLARE @TABLES TABLE (SERVERNAME VARCHAR(100),DBNAME VARCHAR(100),[SCHEMA] VARCHAR(100),[TABLE] VARCHAR(100),[COLUMN] VARCHAR(100),DATA_TYPE VARCHAR(100)) 
DECLARE C CURSOR FOR 
SELECT quotename(srvname) FROM MASTER.SYS.sysservers WHERE SRVID>0 AND providername='SQLOLEDB' 
OPEN C 
FETCH NEXT FROM C INTO @SERVER 
WHILE @@FETCH_STATUS=0 
BEGIN 


    SET @QUERY='EXEC (''SELECT name FROM SYS.databases WHERE owner_sid>1'') AT '[email protected]+' ' 
    INSERT INTO @DBNAME EXEC (@QUERY) 
    DECLARE D CURSOR FOR 
    SELECT QUOTENAME(DBASE) FROM @DBNAME 
    OPEN D 
    FETCH NEXT FROM D INTO @DBASE 
    WHILE @@FETCH_STATUS=0 
    BEGIN 
     SET @QUERY='EXEC (''USE '[email protected]+'; 
      SELECT @@SERVERNAME,TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS'') AT '[email protected]+' ' 
     INSERT INTO @TABLES EXEC (@QUERY) 
    FETCH NEXT FROM D INTO @DBASE 
    END 
    CLOSE D 
    DEALLOCATE D 

DELETE FROM @DBNAME 
FETCH NEXT FROM C INTO @SERVER 
END 
CLOSE C 
DEALLOCATE C 

SELECT * FROM @TABLES 
+0

私はそれが好きです。ありがとう。 – Tuds

+0

Ranjanaありがとうございます。残念なことに、リンクされたサーバーはRPCをサポートしていないため、このようにクエリを実行することはできません。私には出発点が与えられている。 – Tuds

+0

リンクサーバーのプロパティでRPCを構成する必要があります。 –

関連する問題