2014-08-27 34 views
0

需要在其中創建文件夾和數據庫。由於沒有能力使用變量名和路徑創建數據庫,我試圖使用EXEC()語句。但它失敗,錯誤'日誌附近語法不正確''。我做錯了什麼?如何使用EXEC()語句創建SQL數據庫

USE Master; 
GO 
SET NOCOUNT ON 

-- 1 - Variable declaration 
DECLARE @DBName1 sysname 
DECLARE @DataPath1 nvarchar(500), 
DECLARE @LogPath1 nvarchar(500) 
DECLARE @DirTree TABLE (subdirectory nvarchar(255), depth INT) 
DECLARE @version sysname 
declare @sql nvarchar(500) 
declare @fulldbpath varchar(500) 
declare @fulllogpath varchar(500) 

-- 2 - Initialize variables 
SET @version= 
     CASE SUBSTRING(CONVERT(VARCHAR(50), SERVERPROPERTY('productversion')), 1, 4) 
     WHEN '9.00' THEN '2005' 
     WHEN '10.0' THEN '2008' 
     WHEN '10.5' THEN '2008R2' 
     WHEN '11.0' THEN '2012' 
     WHEN '12.0' THEN '2014' 
    END 
SET @DBName1 = 'DB1' 
SET @DataPath1 = 'G:\StorageGroup1\SQL' + @version+ '\'+ @DBName1 
SET @LogPath1 = 'F:\StorageGroup1\SQL\' + @version+ '\'+ @DBName1 
SET @[email protected]+'\'[email protected]+'.mdf' 
SET @[email protected]+'\'[email protected]+'_log.ldf' 

-- 3 - @DataPath values 
INSERT INTO @DirTree(subdirectory, depth) 
EXEC master.sys.xp_dirtree @DataPath1 

-- 4 - Create the @DataPath directory 
IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @DBName1) 
EXEC master.dbo.xp_create_subdir @DataPath1 

-- 5 - Remove all records from @DirTree 
DELETE FROM @DirTree 

-- 6 - @LogPath values 
INSERT INTO @DirTree(subdirectory, depth) 
EXEC master.sys.xp_dirtree @LogPath1 

-- 7 - Create the @LogPath directory 
IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @DBName1) 
EXEC master.dbo.xp_create_subdir @LogPath1 


--8 -Create database 
    set @sql = 'CREATE DATABASE [@DBName1] 
    ON (NAME = [@DBName1], 
     FILENAME = [@fulldbpath] 
    LOG ON (NAME = [@DBName1] 
     FILENAME = [@fulllogpath] 
      )'      
    EXEC(@sql)   


SET NOCOUNT OFF 
GO 
+2

'打印'出''失敗的'@ sql'命令並在此處發佈。 – gvee 2014-08-27 13:11:51

+0

這: CREATE DATABASE [@ DBName1] \t ON(NAME = [@ DBName1], \t \t FILENAME = [@fulldbpath] \t LOG ON(NAME = [@ DBName1] \t \t FILENAME = [@ fulllogpath] \t \t) – user1980915 2014-08-27 13:18:51

+0

查看問題?';-)'當您嘗試執行確切的語句時會發生什麼? – gvee 2014-08-27 13:26:46

回答

0

這應該工作(它沒有當我嘗試過):

USE MASTER; 
GO 
SET NOCOUNT ON 

-- 1 - Variable declaration 
DECLARE @DBName1 sysname 
DECLARE @DataPath1 nvarchar(500) 
DECLARE @LogPath1 nvarchar(500) 
DECLARE @DirTree TABLE (subdirectory nvarchar(255), depth INT) 
DECLARE @version sysname 
declare @sql nvarchar(500) 
declare @fulldbpath varchar(500) 
declare @fulllogpath varchar(500) 

-- 2 - Initialize variables 
SET @version= 
     CASE SUBSTRING(CONVERT(VARCHAR(50), SERVERPROPERTY('productversion')), 1, 4) 
     WHEN '9.00' THEN '2005' 
     WHEN '10.0' THEN '2008' 
     WHEN '10.5' THEN '2008R2' 
     WHEN '11.0' THEN '2012' 
     WHEN '12.0' THEN '2014' 
    END 
SET @DBName1 = 'DB1' 
SET @DataPath1 = 'G:\StorageGroup1\SQL' + @version+ '\'+ @DBName1 
SET @LogPath1 = 'F:\StorageGroup1\SQL\' + @version+ '\'+ @DBName1  
SET @[email protected]+'\'[email protected]+'.mdf' 
SET @[email protected]+'\'[email protected]+'_log.ldf' 

-- 3 - @DataPath values 
INSERT INTO @DirTree(subdirectory, depth) 
EXEC master.sys.xp_dirtree @DataPath1 

-- 4 - Create the @DataPath directory 
IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @DBName1) 
EXEC master.dbo.xp_create_subdir @DataPath1 

-- 5 - Remove all records from @DirTree 
DELETE FROM @DirTree 

-- 6 - @LogPath values 
INSERT INTO @DirTree(subdirectory, depth) 
EXEC master.sys.xp_dirtree @LogPath1 

-- 7 - Create the @LogPath directory 
IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @DBName1) 
EXEC master.dbo.xp_create_subdir @LogPath1 


--8 -Create database 
select @fulldbpath 
select @fulllogpath 
set @sql = 'CREATE DATABASE ['[email protected]+'] 
    ON (NAME = ['[email protected]+'], 
     FILENAME = ['[email protected]+']) 
    LOG ON (NAME = ['[email protected]+'_log], 
     FILENAME = ['[email protected]+'] 
      )'      
    EXEC(@sql)   

    print @sql 


SET NOCOUNT OFF 
GO 

有聲明部分盈餘逗號,逗號一些在@sql失蹤。此外,日誌和數據庫具有相同的名稱 - 需要不同(我添加了_log作爲日誌的後綴),並且需要轉義的變量,否則它們將不會擴展。

+0

不錯!非常感謝 – user1980915 2014-08-27 13:25:50

+0

@ user1980915樂於幫助。 – jpw 2014-08-27 13:26:05

1

CREATE DATABASE的說法是:

CREATE DATABASE [@DBName1] 
    ON (NAME = [@DBName1], 
     FILENAME = [@fulldbpath] 
    LOG ON (NAME = [@DBName1] 
     FILENAME = [@fulllogpath] 
      ) 

你缺少一個右括號後[@fulldbpath]

set @SQL = ' CREATE DATABASE QUOTENAME(' + @DBName1 + ') 
     ON (NAME = QUOTENAME(' + @DBName1 + '_data), 
      FILENAME = QUOTENAME(' + @fulldbpath + ')) 
     LOG ON (NAME = QUOTENAME(' + @DBName1 + '_log) 
      FILENAME = QUOTENAME(' + @fulllogpath + '))' 

此外,刪除的@DataPath1聲明後面的逗號。

+0

我不認爲這會工作,因爲變量永遠不會被取代......你應該嘗試一下。 – jpw 2014-08-27 13:23:06

+0

@jpw好了,我沒有考慮到這一點。我編輯了答案:) – SchmitzIT 2014-08-27 13:26:05

+0

仍然不行 - db和log名稱不能相同;) – jpw 2014-08-27 13:27:50

相關問題