如果存在多个数据源/数据库

时间:2011-12-06 12:19:36

标签: sql

是否有一种标准的方法来检查数据库中是否只使用纯SQL而不存在数据库特定的表?基本上相当于在任何数据源上使用时都可以工作的IF EXISTS(当然是SQL兼容的)。

更新

如何在本声明中提供给出的示例?

IF(SELECT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'clusterTable200m' 
AND TABLE_TYPE='BASE TABLE')) 
BEGIN  
SELECT 'Exists' 
END 
ELSE  
BEGIN  CREATE TABLE clusterTable200m(CLUSTER_ID int NOT NULL, CELL_GEOM   geometry NOT NULL, CELL_CENTROID geometry NOT NULL , CLUSTER_CENTROID   geometry , CLUSTER_EXTENT  geometry , NUM_POINTS  int , FEATURE_PK  int , PRIMARY KEY (CLUSTER_ID)) SELECT 'Complete'  
END

更新

上面的代码是我想要SQL如何工作的一个注意事项,但有人指出,如果没有存储过程或类似的东西我就不能拥有IF,这是不可能的。我也无法引用ms sql server中的sysobjects,因为这是特定于该数据源的。

我知道这是一个棘手的问题,但如果有人能提供解决方案,我们将非常感激。

更新

好的,因为我认为唯一可行的工作如下:

        string sqlQuery = "SELECT * FROM " + tableName;

        OleDataBaseConnection oleDataBaseConnection = new OleDataBaseConnection();

        bool tableExists = true;

        try
        {
            oleDataBaseConnection.OleExecutePureSqlQuery(sqlQuery);
        }
        catch (Exception exc)
        {
            if (exc.Message.ToUpper().Contains("EXIST"))
            {
                tableExists = false;
            }
            else
            {
                throw;
            }
        }

此代码将尝试从表中返回所有项目(将更改为仅尝试返回第一条记录以防止性能影响),如果失败则检查错误消息中的单词是否存在(以免抑制其他异常)如果存在单词存在,我假设该表不在数据库中。然后,如果表不存在,我的代码会进一步向下,然后运行纯SQL来创建新表。这是迄今为止我唯一的工作,我欢迎任何意见。

2 个答案:

答案 0 :(得分:1)

使用INFORMATION_SCHEMA,对于符合以下条件的系统:

SELECT EXISTS
       ( SELECT *
         FROM INFORMATION_SCHEMA.TABLES
         WHERE TABLE_CATALOG = 'CatalogName'
           AND TABLE_SCHEMA = 'SchemaName' 
           AND TABLE_NAME = 'TableName'
       ) AS answer
FROM dual              --- this may be required in some systems.

Information_schema docs

答案 1 :(得分:0)

// sql server 2000

IF EXISTS (SELECT 1 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE='BASE TABLE' 
    AND TABLE_NAME='tablename') 
        SELECT 'tablename exists.' 
ELSE 
        SELECT 'tablename does not exist.' 

reference