0

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

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 脚本中的每个替换都已经在安装程序的构建时完成。

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

4

3 回答 3

1

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

于 2014-08-28T17:49:05.470 回答
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 – 获取当前数据库名称

于 2014-08-28T17:57:23.570 回答
0

您仍然可以使用Advanced Installer 提供的 SQL 脚本替换支持

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

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

于 2014-08-29T15:13:44.083 回答