admin

使用变量创建架构的脚本

sql

令我感到惊讶的是,这种情况以前从未出现过,但是无论在这里还是在其他地方,我都没有在搜索中找到任何东西。我发现有些模糊的相似之处,这表明问题是我的脚本中的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

阅读 164

收藏
2021-07-01

共1个答案

admin

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
2021-07-01