在其他数据库中创建架构

时间:2015-06-26 08:02:34

标签: sql-server tsql

我在第一个数据库上运行脚本,但我想在其他数据库上创建模式。 具体来说,我正在运行这个脚本:

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 个答案:

答案 0 :(得分: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 @command1=@SQL_SCRIPT