2012-04-21 9 views
0

ODBCドライバを使用するSQLにリンクサーバーがあります。odbcドライバを使用してリンクサーバーからテーブルのリストを取得する

select * from GPData..root.TableName 

問題は、利用可能なすべてのテーブルを表示するには、私が知っている唯一の方法は、Microsoft Accessを開き、のように行動することであるということである:私はすでに私はそうのようにそれを取得することができます参照するテーブルの名前を知っている場合私はリンクされたテーブルを作成するつもりです、そして、そのプロセスの間に、私が選択するテーブルをリストにします。

SSMSからテーブルを直接表示する方法はありますか?もしそうでなければ、どうすればプログラム的に(C言語で優先的に)行うのでしょうか?アクセスは明らかにそれを行うことができるので、何らかの方法が必要です。

答えて

1

ここで私はC#でそれをしました。私は2つのテキストボックスを持つフォームを作成しました。 DSNTextBoxはODBC DSNの名前をとり、OutputFileTextは、生成されたsqlファイルを配置するディレクトリを取ります。このディレクトリには、見つかった各テーブルのビューを作成するコマンドが含まれています。

SQLファイルを実行した後、ビューを介して自分のデータベースの一部であるかのようにテーブルにアクセスできます。そして、このようにして、テーブルが呼び出されたことを事前に知る必要がなく、クエリを書くときにテーブル名を参照できます。

OdbcConnection con = new OdbcConnection(); 
    con.ConnectionString = "DSN=" + DSNTextBox.Text; 
    con.Open(); 

    DataTable schema = con.GetSchema("tables"); 

    foreach (DataRow r in schema.Rows) 
    { 
     var name = r["TABLE_NAME"]; 
     sqlLines.Add("create view " + name + " as select * from " + DSNTextBox.Text + "..root." + name); 
     sqlLines.Add("go"); 
    } 
    con.Close(); 

    if(OutputFileTextBox.Text.Substring(OutputFileTextBox.Text.Length - 1, 1) != "\\") 
     OutputFileTextBox.Text += "\\"; 

    File.WriteAllLines(OutputFileTextBox.Text + DSNTextBox.Text + ".sql" , sqlLines.ToArray()); 
-1

リンクサーバーが他のサーバーに設定しているSQL Serverからコマンドを実行している場合:

あなたはSSMSから直接リモートサーバーに接続することができますしかし、より可能性が高い
SELECT name FROM GPData.database_name.sys.tables; 

、その場合、 :

SELECT name FROM database_name.sys.tables; 

このように、スキーマも気にする必要があるので、テーブル名だけでは満足できない場合があります。したがって:

SELECT qn = QUOTENAME(s.name) + '.' + QUOTENAME(t.name) 
    FROM GPData.database_name.sys.tables AS t 
    INNER JOIN GPData.database_name.sys.schemas AS s 
    ON t.schema_id = s.schema_id 
    ORDER BY qn; 
+0

まず、GPDataがリンクされたサーバー名のときにGPDataをデータベース名に移動したように見えるので、私はあなたの答えに混乱します。第二に、おそらく私はここでクエリに利用できるものについていくつかの仮定をしていますか?これは専有のデータベースのためであり、これらのクエリはすべて私にエラーを与えます。私はここで何かを見逃していますか? –

+0

それでは、データベースの名前を教えてください。申し訳ありませんが余分なものを逃しました。あなたの質問に。 SQL Serverの場所、名前、接続しようとしているデータベース、AccessまたはSSMSからこのクエリを実行する必要があるかどうかをよりよく説明できる場合は、より良い回答を提供することができます。 –

+0

Aaron、助けてくれてありがとう、そして私は最後のコメントでは間違っていないことを願っています。私はSMSSを介して直接やりたいことをどうやってやるのかまだ分かりませんが、私はC#でそれを行う方法を見つけることができました。 –

関連する問題