2014-08-28 60 views
0

我有一個包含一個安裝腳本如下:檢查:表中是否存在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

回答

1

只需從您的查詢中刪除TABLE_CATALOGINFORMATION_SCHEMA.TABLES視圖中的所有表都屬於當前數據庫。

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

0

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

的確,更換是在構建時完成的,但所引用的屬性在安裝時間上解決,因此您可以使用用戶選擇的數據庫名稱。只需正確設置字段「替換爲」:[SELECTED_DB]

腳本中的替換是在構建時完成的,因爲您無法直接編寫腳本中格式化的屬性(語法限制)。

相關問題