是否有一种标准的方法来检查数据库中是否只使用纯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来创建新表。这是迄今为止我唯一的工作,我欢迎任何意见。
答案 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.'