2015-06-26 43 views
1

我有第一個數據庫上運行的腳本,但我想在其他數據庫上創建模式。 具體來說,我運行此腳本:在其他數據庫中創建模式

DECLARE @USE_TEMPLATE VARCHAR(MAX) SET @USE_TEMPLATE = 'USE 
[{DBNAME}]' 

DECLARE @DatabaseName nvarchar(50); DECLARE @HistDatabaseName 
nvarchar(50); 

SET @DatabaseName = DB_NAME(); SET @HistDatabaseName = @DatabaseName + 
N'_Audit' 

DECLARE @SQL_SCRIPT VARCHAR(MAX) 

SET @SQL_SCRIPT = REPLACE(@USE_TEMPLATE, '{DBNAME}', 
@HistDatabaseName) EXECUTE (@SQL_SCRIPT) 

DECLARE @schemaTSQL varchar(100) = 'CREATE SCHEMA [newschema] 
AUTHORIZATION [dbo];' EXECUTE (@schemaTSQL); 

如果我硬編碼的數據庫名稱它的工作原理,但我想在EF遷移中很少使用這個腳本。例如,這工作:

USE [SecondDatabase] 

DECLARE @schemaTSQL varchar(100) = 'CREATE SCHEMA [newschema] 
AUTHORIZATION [dbo];' EXECUTE (@schemaTSQL); 
+1

我不認爲這是可以做到。 CREATE SCHEMA必須是批處理中的第一條語句。通過'EXECUTE'執行的每個批次都有自己的範圍。因此,通過您的「@ USE_TEMPLATE」在第一個'EXECUTE'中更改數據庫不會影響您的範圍,也不會影響第二個'EXECUTE'的範圍,該範圍仍然在原始數據庫內。 –

回答

1

我相信這可以使用sp_MSforeachdb完成。

sp_MSforeachdb是一個未公開的存儲過程,所以通常需要注意。 見this article

這裏是它是如何工作的一個粗略的想法:

DECLARE @DatabaseName nvarchar(50); 
DECLARE @HistDatabaseName nvarchar(50); 
SET @DatabaseName = DB_NAME(); 
SET @HistDatabaseName = @DatabaseName + N'_Audit' 

DECLARE @SQL_SCRIPT NVARCHAR(2000) 
DECLARE @schemaTSQL varchar(100) = 'CREATE SCHEMA [newschema] AUTHORIZATION [dbo];' 

SET @SQL_SCRIPT = 'IF ''?'' = ''' + @HistDatabaseName + ''' 
BEGIN 
    USE [?] 
    IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = ''newschema'') 
    EXEC(''' + @schemaTSQL + ''') 
END' 

EXEC sp_MSforeachdb @[email protected]_SCRIPT