【问题标题】:Script to create a schema using a variable使用变量创建模式的脚本
【发布时间】:2012-01-25 00:20:51
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: sql sql-server tsql schema


    【解决方案1】:

    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
    

    【讨论】:

    • 感谢您抽出宝贵时间回复,但恐怕这对我不起作用。该行显示为 Use [MYDBTEMPLATE]; CREATE SCHEMA [SCHEMA1] AUTHORIZATION [dbo] 这产生了错误“CREATE SCHEMA”必须是查询批处理中的第一条语句。
    • 但是您修改后的代码运行良好!谢谢你,谢谢你,你这个男人!
    • (我会投票给它作为一个有用的答案,但可惜我缺乏声誉。虽然我已经将它标记为“答案”......)
    【解决方案2】:

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

    【讨论】:

    • 谢谢你;我已经开始浏览相关的帮助文件;将来可能会有用。
    【解决方案3】:

    如果你在 EXEC() 中运行 USE 语句,那么在 EXEC() 中也运行其他语句

    但是

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

    【讨论】:

    • 谢谢奥列格;我认为这就是 Mikael 所暗示的,但后来我遇到了“必须是第一个陈述”的问题(我在之前遇到的最初的帖子中忘记提到了。)
    猜你喜欢
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多