使用变量创建模式的脚本

Ala*_*n K 2 sql t-sql sql-server schema

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

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

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

我的技能水平:长时间访问用户,但仍然在探索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
Run Code Online (Sandbox Code Playgroud)

Mik*_*son 5

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

试试这个 master

declare @SQL nvarchar(max)
set @SQL  = N'use tempdb; print db_name()'
exec(@SQL)
print db_name()
Run Code Online (Sandbox Code Playgroud)

结果:

tempdb
master
Run Code Online (Sandbox Code Playgroud)

试试这个:

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
Run Code Online (Sandbox Code Playgroud)

  • (我已经把它投票作为一个有用的答案,但是我缺乏声誉.我把它标记为"答案"虽然...) (2认同)