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