使用变量创建模式的脚本

时间:2011-12-21 05:46:24

标签: sql sql-server tsql schema

我很惊讶之前没有出现过但我在这里或其他地方没有找到任何搜索内容。我发现了一些模糊相似的东西,这表明我的脚本中的使用命令仅持续一行,但没有迹象表明如何解决这个问题。

我正在尝试做的事情:创建一个通用脚本来创建一个包含所有常用模式和表的“模板”数据库。所有变量(例如数据库名称)都应在标题中设置,以便可以根据需要进行更改,并且可以运行脚本而无需进行任何有风险的搜索和替换操作来更改硬编码值。

问题是什么:我无法在正确的数据库中生成模式;他们都在硕士生成。试图明确设置数据库没有帮助;我刚收到运行时错误。

我的技能水平:长时间访问用户,但仍然在探索SQL Server的山脚下。我确信(嗯,希望)这对于更远的人来说这将是非常容易的。

有谁知道我怎么能做这样的事情? (现有代码如下所示。)

DECLARE @DBName NVARCHAR(50) = 'TheDBName';

-- Assume that there's a bunch of code to drop and create the database goes here.
-- This code executes correctly.

SET @SQL = 'Use [' + @DBName + ']';

Print @SQL;

EXEC(@SQL);

SET @Counter = 1;

WHILE @Counter <=3

    BEGIN
        SET @SQL = 'CREATE SCHEMA [' +
        CASE @Counter
            WHEN 1 THEN 'Schema1'
            WHEN 2 THEN 'Schema2'
            WHEN 3 THEN 'Schema3'
        END

        SET @SQL = @SQL + '] AUTHORIZATION [dbo]';

        PRINT 'Creating Schemas, ' + @SQL;

        Exec(@SQL);

    SET @Counter = @Counter + 1;    
END

3 个答案:

答案 0 :(得分:5)

use命令仅更改您所在范围内的当前数据库,并且动态SQL在其自己的范围内运行。

master

尝试此操作
declare @SQL nvarchar(max)
set @SQL  = N'use tempdb; print db_name()'
exec(@SQL)
print db_name()

结果:

tempdb
master

试试这个:

DECLARE @DBName NVARCHAR(50) = 'TheDBName';
DECLARE @SQL NVARCHAR(max)
DECLARE @SQLMain NVARCHAR(max)
DECLARE @Counter int

SET @SQLMain = 'Use [' + @DBName + ']; exec(@SQL)';


SET @Counter = 1;

WHILE @Counter <=3
BEGIN
  SET @SQL = 'CREATE SCHEMA [' +
        CASE @Counter
            WHEN 1 THEN 'Schema1'
            WHEN 2 THEN 'Schema2'
            WHEN 3 THEN 'Schema3'
        END

  SET @SQL = @SQL + '] AUTHORIZATION [dbo]';

  EXEC sp_executesql @SQLMain, N'@SQL nvarchar(max)', @SQL;

  SET @Counter = @Counter + 1;
END

答案 1 :(得分:0)

如果在EXEC()中运行USE语句,则也在EXEC()

中运行其他语句

,但

你必须使用USE databasename stmt。在每个EXEC()

答案 2 :(得分:0)

其他答案已经解释了您的直接问题,但由于这确实是一个部署问题,作为一般解决方案,您可能需要尝试using SQLCMD variables,然后可以从命令行在运行时设置。这将允许您动态地将数据库名称和/或模式名称传递到脚本中,以便您可以使用批处理文件或VS数据库项目自动执行部署。