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

Откуда:
Сообщений: 11
Всем доброго времени суток.
Есть необходимость создавать большое количество БД в MS SQL 2008 R2.
Скрип создания БД cгенерировал при помощи SQL Serever Management Studio и маленько его подправил

DECLARE @NameDB NVARCHAR (64)
DECLARE @NameDBData NVARCHAR (128)
DECLARE @PathNameLog NVARCHAR (512)
DECLARE @PathNameData NVARCHAR (512)

SET @NameDB = 'newdatabase'
    
SET @PathNameData = 'D:\Data\' + @NameDB + '.mdf'
SET @PathNameLog = 'E:\Data\' + @NameDB + '_log.ldf'
SET @NameDBData = @NameDB + '_log'
CREATE DATABASE @NameDB ON  PRIMARY 
( NAME = @NameDB, FILENAME = @PathNameData , SIZE = 3072KB , FILEGROWTH = 1024KB )
 LOG ON 
( NAME = @NameDBData, FILENAME = @PathNameLog , SIZE = 1024KB , FILEGROWTH = 10%)
GO
ALTER DATABASE @NameDB SET COMPATIBILITY_LEVEL = 100
------------------------------------------------------------
--МНОГО СТРОК КОТОРЫЕ ПРОПУСТИЛ
------------------------------------------------------------
ALTER DATABASE @NameDB SET PAGE_VERIFY CHECKSUM  
GO
USE @NameDB
GO
IF NOT EXISTS (SELECT name FROM sys.filegroups WHERE is_default=1 AND name = N'PRIMARY') ALTER DATABASE @NameDB MODIFY FILEGROUP [PRIMARY] DEFAULT
GO


При попытке выполнения вываливается список ошибок

Msg 102, Level 15, State 1, Line 11
Неправильный синтаксис около конструкции "@NameDB".
Msg 102, Level 15, State 1, Line 1
Неправильный синтаксис около конструкции "@NameDB".
Msg 102, Level 15, State 1, Line 1
Неправильный синтаксис около конструкции "@NameDB".
Msg 195, Level 15, State 5, Line 1
ANSI_NULL_DEFAULT не является известным параметр SET.
Msg 102, Level 15, State 1, Line 1
Неправильный синтаксис около конструкции "@NameDB".
--И ЕЩЕ КУЧА ПОДОБНЫХ


Если выполнять скрипт сгенерированный SMS
REATE DATABASE [newdatabase] ON  PRIMARY 
( NAME = N'newdatabase', FILENAME = N'D:\Data\newdatabase.mdf' , SIZE = 3072KB , FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'newdatabase_log', FILENAME = N'E:\Data\newdatabase_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
GO
ALTER DATABASE [newdatabase] SET COMPATIBILITY_LEVEL = 100
GO

--ОПЯТЬ ВСЕ КОМАНДЫ НЕ ПИШУ

ALTER DATABASE [newdatabase] SET PAGE_VERIFY CHECKSUM  
GO
USE [newdatabase]
GO
IF NOT EXISTS (SELECT name FROM sys.filegroups WHERE is_default=1 AND name = N'PRIMARY') ALTER DATABASE [newdatabase] MODIFY FILEGROUP [PRIMARY] DEFAULT
GO

все проходит без ошибок
Сделанный по такому же принципу скрипт бекапа работает без проблем
DECLARE @NameDB NVARCHAR (128)
DECLARE @PathName NVARCHAR (512)
DECLARE @NameBackup NVARCHAR (512)

    SET @NameDB = 'data'

SET @PathName = 'D:\Bak\' + @NameDB + '.bak'
SET @NameBackup = @NameDB + '-Full Database Backup'
BACKUP DATABASE @NameDB TO  DISK = @PathName WITH NOFORMAT, NOINIT,  NAME = @NameBackup, SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO


Как правильно воткнуть переменную в CREATE DATABASE ?
Или придется использовать запросы вида

SET @SQL = 'CREATE DATABASE '+@NameDB+' ON  PRIMARY 
( NAME = @NameDB, FILENAME = '@PathNameData', SIZE = 3072KB , FILEGROWTH = 1024KB )
 LOG ON 
( NAME = '@NameDBData', FILENAME = '@PathNameLog' , SIZE = 1024KB , FILEGROWTH = 10%)
GO'
exec(@SQL)


За ранее спасибо.
19 дек 11, 09:24    [11786687]     Ответить | Цитировать Сообщить модератору
 Re: Создание БД при помощи скрипта. Имя БД в переменой.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Asples
Или придется использовать запросы вида
Да
19 дек 11, 09:26    [11786695]     Ответить | Цитировать Сообщить модератору
 Re: Создание БД при помощи скрипта. Имя БД в переменой.  [new]
Asples
Member

Откуда:
Сообщений: 11
Переделал запрос теперь вообще не понятно на что ругается


DECLARE @NameDB NVARCHAR (64)
DECLARE @NameDBData NVARCHAR (128)
DECLARE @PathNameLog NVARCHAR (512)
DECLARE @PathNameData NVARCHAR (512)
DECLARE @SqlQery NVARCHAR (4000)

SET @NameDB = 'newdatabase'
    
SET @PathNameData = 'D:\Data\' + @NameDB + '.mdf'
SET @PathNameLog = 'E:\Data\' + @NameDB + '_log.ldf'
SET @NameDBData = @NameDB + '_log'

SET @SqlQery = 'CREATE DATABASE '+ @NameDB +' ON  PRIMARY 
( NAME = '+ @NameDB +', FILENAME = '+ @PathNameData +' , SIZE = 3072KB , FILEGROWTH = 1024KB ) 
LOG ON 
( NAME = '+ @NameDBData +', FILENAME = '+ @PathNameLog +' , SIZE = 1024KB , FILEGROWTH = 10%) GO'
exec(@SqlQery) 

SET @SqlQery = 'ALTER DATABASE '+@NameDB+' SET COMPATIBILITY_LEVEL = 100
GO'
exec(@SqlQery)

SET @SqlQery = 'USE '+@NameDB+'
GO'
DECLARE @NamePrim NVARCHAR (64)
SET @NamePrim = 'PRIMARY'
exec(@SqlQery)

SET @SqlQery = 'IF NOT EXISTS (SELECT name FROM sys.filegroups WHERE is_default=1 AND name = N'+@NamePrim+') ALTER DATABASE '+@NameDB+' MODIFY FILEGROUP '+@NamePrim+' DEFAULT
GO'


Получаем сообщения вида

Msg 102, Level 15, State 1, Line 2
Неправильный синтаксис около конструкции "D:".
Msg 102, Level 15, State 1, Line 2
Неправильный синтаксис около конструкции "GO".
Msg 102, Level 15, State 1, Line 2
--и еще много таких же сообщений


Я конечно понимаю что я что-то делаю не правильно(( а вот что не знаю.
19 дек 11, 10:08    [11786898]     Ответить | Цитировать Сообщить модератору
 Re: Создание БД при помощи скрипта. Имя БД в переменой.  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
а Вы можете вместо выполнения сформированного запроса просто увидеть его? команда Print например... а дальше посмотреть что там ни так?
19 дек 11, 10:11    [11786918]     Ответить | Цитировать Сообщить модератору
 Re: Создание БД при помощи скрипта. Имя БД в переменой.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Asples
Я конечно понимаю что я что-то делаю не правильно(( а вот что не знаю.
Хорошо помогает чтение того запроса, который ошибочный. Поставьте print вместо exec

Пока что, с первого взгляда, видно, что используется GO, а такой команды сиквел не знает.
19 дек 11, 10:11    [11786919]     Ответить | Цитировать Сообщить модератору
 Re: Создание БД при помощи скрипта. Имя БД в переменой.  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Asples,

а разве имя файла не надо поместить в одинарные кавычки?
И ещё: если тип строки юникодный, то литеральные строки должны начинаться с буквы N (SET @PathNameData = N'D:\Data\' + @NameDB + N'.mdf')
19 дек 11, 10:13    [11786933]     Ответить | Цитировать Сообщить модератору
 Re: Создание БД при помощи скрипта. Имя БД в переменой.  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Кстати, GO в майкрософтовских утилитах может стоять только в начале строки.
И на этой строке больше ничего не должно быть.
Я неправ?

Но в скрипте, отправляемом непосредственно серверу, никакого GO быть не может, как уже сказали.
19 дек 11, 10:17    [11786956]     Ответить | Цитировать Сообщить модератору
 Re: Создание БД при помощи скрипта. Имя БД в переменой.  [new]
Asples
Member

Откуда:
Сообщений: 11
Всем большое спасибо заработало, команда print() очень помогла, сразу увидел в чем проблема. Дело и правда было в кавычках, после выполнения, в выполняемом запросе их просто не было. И команда GO тоже не нужна, интересно для чего SMS её создает.
19 дек 11, 10:41    [11787110]     Ответить | Цитировать Сообщить модератору
 Re: Создание БД при помощи скрипта. Имя БД в переменой.  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Asples
И команда GO тоже не нужна, интересно для чего SMS её создает.
Я тут интересный сайт нашел.
http://msdn.microsoft.com/ru-ru/library/ms188037.aspx
19 дек 11, 10:57    [11787204]     Ответить | Цитировать Сообщить модератору
 Re: Создание БД при помощи скрипта. Имя БД в переменой.  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
Deff
Asples
И команда GO тоже не нужна, интересно для чего SMS её создает.
Я тут интересный сайт нашел.
http://msdn.microsoft.com/ru-ru/library/ms188037.aspx


Ого, сайт очень интересный и главное ни кто о нем не знает

зы А в BOL тоже самое не находили?
19 дек 11, 11:05    [11787255]     Ответить | Цитировать Сообщить модератору
 Re: Создание БД при помощи скрипта. Имя БД в переменой.  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
SanyL
А в BOL тоже самое не находили?
Не везде установлен BOL. Но везде установлен интернет)
19 дек 11, 11:19    [11787351]     Ответить | Цитировать Сообщить модератору
 Re: Создание БД при помощи скрипта. Имя БД в переменой.  [new]
bazile
Member

Откуда:
Сообщений: 3082
Asples
Как правильно воткнуть переменную в CREATE DATABASE?

В утилите sqlcmd переменные поддерживаются.
19 дек 11, 12:10    [11787741]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить