Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Использование переменных в Create Database  [new]
hrimfaxi
Member

Откуда:
Сообщений: 6
Приветствую.
Уточняя заголовок темы. Требуется изготовить скрипт (сценарий) для установки базы.
CREATE DATABASE [shkola] ON  PRIMARY 
( NAME = N'shkola', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\shkola.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )

Генерируется деревянная часть кода с путём к файлу базы. К сожалению, это подходит далеко не для всех ОС, т. к. путь может отличаться (версии сервера или битность системы).
Один из вариантов, которые я рассматривал:
DECLARE @data_path nvarchar(256);
SET @data_path = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)
                  FROM master.sys.master_files
                  WHERE database_id = 1 AND file_id = 1);

К сожалению, в аргумент FILENAME невозможно прямо вставить значение переменной.
Нашёл выход в динамических запросах:
DECLARE @SQL nvarchar(max);
 SET @SQL = 
                  'CREATE DATABASE [21] ON  PRIMARY 
(NAME = N''''21'''', FILENAME = N'''''+@filename_mdf+''''', SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )';
exec(@SQL);

Но тоже глухо. В зависимости от количества символа ' возникают разные ошибки. То пустой SELECT INTO, то недосчёт по кавычкам.
Как правильно впихнуть содержимое переменной в запрос на создание базы?
25 апр 14, 03:58    [15932952]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в Create Database  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
hrimfaxi,

DECLARE @SQL nvarchar(max);
 SET @SQL = 
                  'CREATE DATABASE [21] ON  PRIMARY 
(NAME = N''21'', FILENAME = N'''+@filename_mdf+''', SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )';
25 апр 14, 04:36    [15932959]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в Create Database  [new]
hrimfaxi
Member

Откуда:
Сообщений: 6
Ruuu, благодарю.
Тогда я, пожалуй, приведу более полный кусок.
USE [master]
GO
/****** Object:  Database [21]    Script Date: 04/25/2014 00:58:25 ******/
DECLARE @data_path nvarchar(256);
DECLARE @filename_mdf nvarchar(256);
DECLARE @filename_log varchar(256);
DECLARE @SQL nvarchar(max);
SET @data_path = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)
                  FROM master.sys.master_files
                  WHERE database_id = 1 AND file_id = 1);
                  set @filename_mdf = ''''+@data_path + '''21.mdf''';
                  set @filename_log = ''''+@data_path + '''21_log.ldf''';
                  SET @SQL = 
                  'CREATE DATABASE [21] ON  PRIMARY 
(NAME = N''21'', FILENAME = N'''+@filename_mdf+''', SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )';
25 апр 14, 04:45    [15932962]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в Create Database  [new]
hrimfaxi
Member

Откуда:
Сообщений: 6
Ошибка при этом такая:
Сообщение 1038, уровень 15, состояние 1, строка 2
Имя объекта или столбца отсутствует или пусто. Убедитесь, что каждый из столбцов в инструкции SELECT INTO имеет имя. Для других инструкций проверьте наличие пустых имен-псевдонимов. Не допускаются псевдонимы, определенные как [] или "". Измените псевдоним на допустимое имя.
25 апр 14, 04:46    [15932963]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в Create Database  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
автор

set @filename_mdf = @data_path + '21.mdf';
set @filename_log = @data_path + э21_log.ldf';


Уберите лишние кавычки
25 апр 14, 04:56    [15932970]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в Create Database  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
э = '
автор
set @filename_mdf = @data_path + '21.mdf';
set @filename_log = @data_path + '21_log.ldf';
25 апр 14, 04:57    [15932971]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в Create Database  [new]
hrimfaxi
Member

Откуда:
Сообщений: 6
Volochkova, Вы — гений :-)
Вроде всё, кроме:
Сообщение 15007, уровень 16, состояние 1, строка 2
admin" не является допустимым именем входа или отсутствует разрешение.
USE [shkola]
GO
/****** Object:  User [admin]    Script Date: 04/24/2014 22:02:43 ******/
CREATE USER [admin] FOR LOGIN [admin] WITH DEFAULT_SCHEMA=[dbo]
GO
25 апр 14, 05:09    [15932973]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в Create Database  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
hrimfaxi,

сначала нужно создать логин на сервере, если его еще нет, потом уже пользователя в бд.
http://technet.microsoft.com/en-us/library/aa337562.aspx
25 апр 14, 06:24    [15933012]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в Create Database  [new]
hrimfaxi
Member

Откуда:
Сообщений: 6
Ruuu, благодарю :-)
Разобрался, тему можно закрывать.
25 апр 14, 06:40    [15933024]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить