2017-06-01 38 views
0

我想創建SQL腳本,它將在服務器上工作,以檢查數據庫是否存在,然後創建新的,如果它存在,然後更新其表和SP的。但問題是它不存在,它創建數據庫,但表和sp的去掌握數據庫。Sql腳本爲新數據庫創建問題

樣本。

DECLARE @dbname nvarchar(128) 
    SET @dbname = N'ABC' 

    IF (NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE ('[' + 
    name + ']' = @dbname OR name = @dbname))) 
    BEGIN 
     PRINT 'New Database ' 
     CREATE DATABASE [ABC]; 
     USE ABC; // This use statement is not working i supposed 

     CREATE TABLE [dbo].[Product_Container](
      [ProductID] [int] NOT NULL, 
      [ContainerID] [int] NOT NULL, 
      [AssociatedProductID] [int] NOT NULL 
     ) ON [PRIMARY] 


     END 
    ELSE 
     BEGIN 
      PRINT 'Existing Database ' 
     END 
+0

標記您正在使用的dbms。該代碼是特定於產品的。 – jarlh

回答

0

這是正在運行的代碼。

begin 
DECLARE @dbname nvarchar(128), @command1 nvarchar(max), @command2 nvarchar(max) 
SET @dbname = N'ABC' 
    IF (NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = @dbname)) 
    BEGIN 
     PRINT 'New Database Creating' + @dbname 
     set @command1 = 'USE MASTER; CREATE DATABASE ' + @dbname + '; ' 
     --set @command += 'USE ' + @dbname + '; ' 

     set @command2 = 'CREATE TABLE [ABC].[dbo].[Product_Container](
      [ProductID] [int] NOT NULL, 
      [ContainerID] [int] NOT NULL, 
      [AssociatedProductID] [int] NOT NULL 
     ) ON [PRIMARY];' 

     END 
    ELSE 
     BEGIN 
      PRINT 'Existing Database ' + @dbname 
     END 
    exec sp_executesql @command1; 
    exec sp_executesql @command2; 
    end; 
+1

但GO命令在IF條件下潛在的錯誤 – Ahmed

+0

如果您希望強制執行批次,則需要使用動態續集 –

+0

抱歉,我沒有得到您 – Ahmed

0

USE語句中的數據庫名稱被解釋爲腳本正在被解析; 之前腳本正在執行。 因此,CREATE DATABASEUSE不能在同一批次中。

我建議分成多個批次的腳本。 這意味着你將不得不擺脫IF聲明。 我建議使用例外。

分批分割腳本並不像看起來那麼直截了當。 即使第一批次失敗,即使異常也不會阻止第二批次執行。 正如@clifton_h所提議的那樣,您可以使用動態SQL。 這意味着,把整個第二部分放在一個字符串中。 我並不特別喜歡這種方法,因爲它使腳本難以維護。

DECLARE @dbname nvarchar(128) = N'ABC'; 
IF DB_ID(@dbname) IS NOT NULL THROW 51000, 'Existing Database.', 1; 
PRINT 'New Database.'; 
CREATE DATABASE [ABC]; 
EXEC(' 
    USE ABC; 
    CREATE TABLE [dbo].[Product_Container](
     [ProductID] [int] NOT NULL, 
     [ContainerID] [int] NOT NULL, 
     [AssociatedProductID] [int] NOT NULL 
    ) ON [PRIMARY]; 
'); 

另一種方法是簡單地使兩個腳本,然後用一個批處理文件或PowerShell腳本之後,其他執行一個,考慮到第一個腳本拋出的異常。

第一個腳本創建數據庫:

DECLARE @dbname nvarchar(128) = N'ABC'; 
IF DB_ID(@dbname) IS NOT NULL THROW 51000, 'Existing Database.', 1; 
PRINT 'New Database.'; 
CREATE DATABASE [ABC]; 

第二個腳本創建表和其它數據庫對象:

USE ABC; 
CREATE TABLE [dbo].[Product_Container](
    [ProductID] [int] NOT NULL, 
    [ContainerID] [int] NOT NULL, 
    [AssociatedProductID] [int] NOT NULL 
) ON [PRIMARY]; 

最後,樣品批處理文件把它放在一起:

@echo off 
echo Script 1... 
sqlcmd -b -E -i script1.sql 
if errorlevel 1 goto end 
echo Script 2... 
sqlcmd -b -E -i script2.sql 
if errorlevel 1 goto end 
echo Successfully completed. 
:end