Check if a SQL table exists

后端 未结 9 2282
北海茫月
北海茫月 2020-12-01 06:30

What\'s the best way to check if a table exists in a Sql database in a database independant way?

I came up with:

   bool exists;
   const string sql         


        
相关标签:
9条回答
  • 2020-12-01 06:34

    The following works well for me...

    private bool TableExists(SqlConnection conn, string database, string name)
    {
        string strCmd = null;
        SqlCommand sqlCmd = null;
    
        try
        {
            strCmd = "select case when exists((select '['+SCHEMA_NAME(schema_id)+'].['+name+']' As name FROM [" + database + "].sys.tables WHERE name = '" + name + "')) then 1 else 0 end";
            sqlCmd = new SqlCommand(strCmd, conn);
    
            return (int)sqlCmd.ExecuteScalar() == 1;
        }
        catch { return false; }
    }
    
    0 讨论(0)
  • 2020-12-01 06:38

    If you're trying for database independence you will have to assume a minimum standard. IIRC The ANSI INFORMATION_SCHEMA views are required for ODBC conformance, so you could query against them like:

    select count (*) 
      from information_schema.tables 
     where table_name = 'foobar'
    

    Given that you are using ODBC, you can also use various ODBC API calls to retrieve this metadata as well.

    Bear in mind that portability equates to write-once test anywhere so you are still going to have to test the application on every platform you intend to support. This means that you are inherently limited to a finite number of possible database platforms as you only have so much resource for testing.

    The upshot is that you need to find a lowest common denominator for your application (which is quite a lot harder than it looks for SQL) or build a platform-dependent section where the non-portable functions can be plugged in on a per-platform basis.

    0 讨论(0)
  • 2020-12-01 06:43
    bool exists;
    
    try
    {
        // ANSI SQL way.  Works in PostgreSQL, MSSQL, MySQL.  
        var cmd = new OdbcCommand(
          "select case when exists((select * from information_schema.tables where table_name = '" + tableName + "')) then 1 else 0 end");
    
        exists = (int)cmd.ExecuteScalar() == 1;
    }
    catch
    {
        try
        {
            // Other RDBMS.  Graceful degradation
            exists = true;
            var cmdOthers = new OdbcCommand("select 1 from " + tableName + " where 1 = 0");
            cmdOthers.ExecuteNonQuery();
        }
        catch
        {
            exists = false;
        }
    }
    
    0 讨论(0)
  • 2020-12-01 06:45

    I would avoid executing the select count(x) from xxxxxx as the DBMS will actually go ahead and do it which may take some time for a large table.

    Instead just prepare a select * from mysterytable query. The prepare will fail if mysterytable does not exist. There is no need to actually execute the prepared statement.

    0 讨论(0)
  • 2020-12-01 06:48

    In current project on my job I need to write 'data agent' which would support a lot of database types.

    So I decided to do next: write a base class with the base (database independent) functionality using virtual methods and override in subclasses all database-specific moments

    0 讨论(0)
  • 2020-12-01 06:48

    Very Simple

    use YOUR_DATABASE --OPTIONAL
    SELECT count(*) as Exist from INFORMATION_SCHEMA.TABLES where table_name = 'YOUR_TABLE_NAME'
    

    If the answer is 1, There is a table. If the answer is 0, There is no table.

    0 讨论(0)
提交回复
热议问题