【问题标题】:Check: does table exist in SQL Server database?检查:SQL Server 数据库中是否存在表?
【发布时间】:2014-08-28 17:43:34
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以选择实际使用的数据库的名称并在执行语句中替换它。

      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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2020-08-16
          • 1970-01-01
          • 2010-10-15
          • 1970-01-01
          • 2010-09-15
          • 1970-01-01
          • 2012-02-13
          • 1970-01-01
          相关资源
          最近更新 更多