使用odbc驱动程序从链接服务器检索表列表

时间:2012-04-21 20:38:23

标签: sql-server-2008 odbc linked-server

我在SQL中有一个使用ODBC驱动程序的链接服务器。如果我已经知道我想要的表的名称,我可以像这样检索它:

select * from GPData..root.TableName

问题是我知道查看所有可用表的唯一方法是打开Microsoft Access并表现得像我要创建一个链接表,在此过程中它将列出表供我选择

有没有办法直接从SSMS列出表格?如果没有,我怎样才能在程序上进行编程(最好是在C#中)?必须有一些方法,因为Access显然能够做到这一点。

2 个答案:

答案 0 :(得分:1)

以下是我在C#中的表现。我创建了一个带有两个文本框的表单。 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 :(得分:-1)

如果从具有链接服务器的SQL Server运行命令,该服务器设置为其他服务器:

SELECT name FROM GPData.database_name.sys.tables;

但是,您更有可能直接从SSMS连接到远程服务器,在这种情况下:

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;