Скрипт для создания схемы с использованием переменной - PullRequest
2 голосов
/ 21 декабря 2011

Я удивлен, что такого раньше не было, но я не нашел ничего в поисках ни здесь, ни где-либо еще. Я обнаружил что-то неопределенно похожее, что указывает на то, что проблема в том, что команда 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

Ответы [ 3 ]

5 голосов
/ 21 декабря 2011

Команда 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
0 голосов
/ 21 декабря 2011

Другие ответы объяснили вашу непосредственную проблему, но поскольку это действительно проблема развертывания, в качестве общего решения вы можете попробовать , используя переменные SQLCMD , которые затем можно установить во время выполнения из командной строки.Это позволит вам динамически передавать имя базы данных и / или схемы в сценарии, чтобы затем можно было автоматизировать развертывание с использованием пакетных файлов или проектов базы данных VS.

0 голосов
/ 21 декабря 2011

Если вы выполняете оператор USE внутри EXEC (), тогда выполняйте другие операторы также в EXEC ()

но

вы должны использовать USE databasename stmt. в каждом EXEC ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...