检查:表中是否存在SQL Server数据库?

问题描述:

我有一个包含一个安装脚本如下:检查:表中是否存在SQL Server数据库?

IF NOT EXISTS(
    SELECT * FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_CATALOG = 'mydatabasename' 
     AND TABLE_SCHEMA = 'dbo' 
     AND TABLE_NAME = 'sometablename' 
     AND TABLE_TYPE = 'BASE TABLE' 
) 
CREATE TABLE dbo.sometablename ... 

问题是,

  • 我必须让用户选择不同的数据库名
  • 我不能使用任何占位符(“变量“)在脚本中。
  • 数据库服务器中当然可含有已经包含一个表sometablename

在执行脚本之前安装程序会对一个USE mydatabasename不同的数据库;安装程序允许为此选择一个变量数据库名称。但是,我不能在脚本中使用该变量,因为SQL脚本中的每个替换都已在安装程序构建时完成。

那么,如何检查使用的数据库是否已经包含表sometablename

只需从您的查询中删除TABLE_CATALOGINFORMATION_SCHEMA.TABLES视图中的所有表都属于当前数据库。

您可以选择正在使用的实际数据库的名称,并将其替换为执行语句。

declare @dbname varchar(50) -- Adjust to your longer database name length. 

set  @dbname = db_name() 

if not exists (
    select 1 
     from information_schema.tables 
     where table_catalog = @dbname 
      and table_schema = 'dbo' 
      and table_name = 'someTableName' 
      and table_type = 'base table' 
) begin 
    execute (
     'create table ' + @dbname + '.dbo.someTableName (
      someFieldName someDataType 
      ... 
     )' 
    ) 
end 

否则,它总是使用当前数据库,使其目前在考虑通过你use语句中使用选择的数据库。

SQL SERVER – Get Current Database Name

你仍然可以使用SQL Script replacement support from Advanced Installer

的确,更换是在构建时完成的,但所引用的属性在安装时间上解决,因此您可以使用用户选择的数据库名称。只需正确设置字段“替换为”:[SELECTED_DB]

脚本中的替换是在构建时完成的,因为您无法直接编写脚本中格式化的属性(语法限制)。