sql - 使用变量创建模式的脚本

标签 sql sql-server tsql schema

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

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

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

我的技能水平:长期使用 Access,但仍处于探索 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

最佳答案

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

关于sql - 使用变量创建模式的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8585577/

相关文章:

sql-server - 比较多行日期的最佳方法

SQL 获取未在项目中工作的名称

sql - 使用动态文件名将 sql 函数的输出保存到 csv 文件(COPY)

sql-server - 从SSMS连接到在容器内运行的SQL Server Express

sql-server - 将记录从 CTE 插入到表中

sql-server - 如何解码 D7 中的 XML Blob 字段

sql-server-2008 - T-SQL输出更新结果

excel - 当源自 excel 的数据中存在各种特殊字符时,将 varchar 转换为 decimal

mysql - 我应该使用多个查询或函数吗?

mysql - 修改子查询中的日期会减慢执行速度