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

时间:2014-08-28 17:43:34

标签: sql-server information-schema advanced-installer

我有一个包含以下内容的安装脚本:

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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