Как я могу создать базу данных и использовать операторы в одном скрипте? - PullRequest
1 голос
/ 18 сентября 2011

Рассмотрим следующий скрипт:

DECLARE @path varchar(MAX)
DECLARE @script varchar(MAX)
SET @path = (SELECT physical_name FROM sys.master_files where name = 'master');
SET @path = REPLACE(@path, 'master.mdf', '');
SELECT @path;

SET @script = 
'CREATE DATABASE test
 ON PRIMARY
 (NAME = test_primary,
  FILENAME = ''' + @path + 'test_primary.mdf'',
  SIZE = 10MB,
  FILEGROWTH = 10MB)';

exec(@script);

USE test

Когда я пытаюсь запустить все сразу, я получаю сообщение об ошибке:

Msg 911, Level 16, State 1, Line 31
Database 'test' does not exist. Make sure that the name is entered correctly.

Если я сначала запускаю exec, а затем отдельно запускаю USE, то все идет хорошо.

Вопрос в том, как мне обойти это, чтобы можно было запустить весь сценарий одновременно без ошибок?

Ответы [ 3 ]

3 голосов
/ 18 сентября 2011

SQL Server компилирует код для одного пакета за раз.Когда ваш код скомпилирован, база данных не существует.

Добавьте пакетный разделитель перед use test.

DECLARE @path varchar(MAX)
DECLARE @script varchar(MAX)
SET @path = (SELECT physical_name FROM sys.master_files where name = 'master');
SET @path = REPLACE(@path, 'master.mdf', '');
SELECT @path;

SET @script = 
'CREATE DATABASE test
 ON PRIMARY
 (NAME = test_primary,
  FILENAME = ''' + @path + 'test_primary.mdf'',
  SIZE = 10MB,
  FILEGROWTH = 10MB)';

exec(@script);

GO

USE test
3 голосов
/ 18 сентября 2011

Если вы выполняете операторы из одного из инструментов запросов SQL Server (например, менеджер предприятия, студия управления или sqlcmd), вставьте оператор GO перед командой USE test. Это разделяет команды на отдельные партии. Если вы выполняете сценарий через одного из программных клиентов, то вы должны выполнить пакеты отдельно, разделив сценарий.

0 голосов
/ 18 сентября 2011

Разве USE не может быть в верхней части скрипта?

USE выбирает правильную базу данных для вас.Затем запустите скрипт в этой базе данных

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