Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Incorrect syntax near '-'  [new]
davydovk
Member

Откуда:
Сообщений: 23
Добрый день.
При выполнении скрипта:

USE [master]
GO
DECLARE @DBName nvarchar(50), @DBNameBackup nvarchar(50), @DBName_mdf varchar(500),  @DBName_ldf varchar(500), @MyDBNamelog varchar(500);
DECLARE @InstallDbPath nvarchar(max), @InstallDbPathLog nvarchar(max), @RestoreDbPath nvarchar(max), @RestoreDbPathLog nvarchar(max), @DBNamelog nvarchar(max),@BackupFolder nvarchar(max), @FullBackupPath nvarchar(max), @BackupFolderRecovery nvarchar(max), @FullBackupPathRecovery nvarchar(max);
--Формирование даты для бэкапа
DECLARE @BackupDate nvarchar(max) = CONVERT(varchar(10),GETDATE(),105);
--Каталог для бэкапа
DECLARE @BackupPath nvarchar(500) = 'D:\Backup';
SET @DBName = '$(varDBdatabase_recovery)';  --'$(varDBName)';  -- параметр из PowerShell
SET @DBNameBackup = '$(varDBdatabase_backup)';--'$(varDBNameBackup)';  -- параметр из PowerShell

SET @InstallDbPath = 'E:\DATA\' + @DBName + '.mdf';--база в которую заливаем
SET @InstallDbPathLog = 'U:\LOG\' + @DBName + '_log.ldf';
SET @RestoreDbPath = 'E:\DATA\' + @DBNameBackup + '.mdf';--база из которой заливаем
SET @RestoreDbPathLog = 'U:\LOG\' + @DBNameBackup + '_log.ldf';
SET @DBNamelog = @DBName+'_log';

Declare @SQLCmd as nvarchar(max);
Declare @SQLCmd5 as nvarchar(max);

IF EXISTS ( SELECT * FROM sysdatabases WHERE name = @DBName)
BEGIN
	Declare @SQLCmd1 as nvarchar(max);
	set @SQLCmd1 = 'USE master; ALTER DATABASE ' + @DBName + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE'; 
	exec (@SQLCmd1);
	PRINT N'База переведена в монопольный режиме';
	
	SET @BackupFolder = @BackupPath + '\' + @DBNameBackup;
    SET @FullBackupPath = @BackupFolder + '\' + @DBNameBackup + '_' + @BackupDate + '.bak';
	SET @BackupFolderRecovery = @BackupPath + '\' + @DBName;
	SET @FullBackupPathRecovery = @BackupFolderRecovery + '\' + @DBName + '_' + @BackupDate + '.bak';
	--PRINT N'База существует';
    
	set @SQLCmd5 = 'RESTORE FILELISTONLY FROM DISK = N''' + @FullBackupPathRecovery + ''' WITH  FILE = 1;'
	select @SQLCmd5;
    exec (@SQLCmd5);
	
	set @SQLCmd = 'RESTORE DATABASE ' + @DbName + ' FROM  DISK = N''' + @FullBackupPath + ''' WITH  FILE = 1,  
	MOVE N'''+@DBName+''' TO N'''+@InstallDbPath+''',  MOVE N'''+@DBNamelog+''' TO N'''+@InstallDbPathLog+''',  NOUNLOAD,  REPLACE,  STATS = 5';
	select @SQLCmd;
	exec (@SQLCmd);
	PRINT N'База восстановлена';
	
	Declare @SQLCmd2_2 as nvarchar(max);
	set @SQLCmd2_2 = 'USE ' + @DBName + '; CREATE USER [user1c_ats] FOR LOGIN [user1c_ats] WITH DEFAULT_SCHEMA=[dbo]'; 
	exec (@SQLCmd2_2);
	PRINT N'Создали пользователя user1c_ats у базы - '+ @DBName;
	
	Declare @SQLCmd2 as nvarchar(max);
	set @SQLCmd2 = 'USE ' + @DBName + '; exec sp_changedbowner ''user1c_ats'''; 
	exec (@SQLCmd2);
    PRINT N'Пользователя user1c_ats сделали владельцем базы';
	
	Declare @SQLCmd2_1 as nvarchar(max);
	set @SQLCmd2_1 = 'USE ' + @DBName + '; ALTER ROLE db_owner ADD MEMBER user1c_ats'; 
	exec (@SQLCmd2_1);
    PRINT N'У пользователя user1c_ats добавили права db_owner к базе';
	
	Declare @SQLCmd3 as nvarchar(max);
	set @SQLCmd3 = 'USE master; ALTER DATABASE ' + @DBName + ' SET MULTI_USER'; 
	
	exec (@SQLCmd3);
	
	Declare @SQLCmd4 as nvarchar(max);
	set @SQLCmd4 = 'USE master; ALTER DATABASE ' + @DBName + ' SET RECOVERY SIMPLE'; 
	exec (@SQLCmd4);
	--ALTER DATABASE [@DBName] SET MULTI_USER
	PRINT N'База переведена в многопользовательский режим';
	--ALTER DATABASE [@DBName] SET RECOVERY SIMPLE
    PRINT N'Режим восстановления базы переведен в Simple';
	
	Declare @SQLCmd6 as nvarchar(max);
	set @SQLCmd6 = 'USE ' + @DBName + '; ALTER DATABASE ' + @DBName + ' MODIFY FILE (NAME=' + @DBNameBackup + ', NEWNAME=' + @DBName + ')'; 
	exec (@SQLCmd6);
	Declare @SQLCmd7 as nvarchar(max);
	set @SQLCmd7 = 'USE ' + @DBName + '; ALTER DATABASE ' + @DBName + ' MODIFY FILE (NAME=' + @DBNameBackup + '_log, NEWNAME=' + @DBName + '_log)'; 
	exec (@SQLCmd7);
	PRINT N'Изменили логические имена файлов';
	
	
END
ELSE
BEGIN
	PRINT N'База не существует';
END


Выскакивает ошибка "Incorrect syntax near '-'". Это из-за того, что $(varDBdatabase_recovery) я передаю название CDOP-1111. Как это лечится?
20 ноя 17, 13:07    [20968883]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
Nickolay-123
Member

Откуда:
Сообщений: 21
[CDOP-1111]
20 ноя 17, 13:13    [20968912]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
davydovk
Member

Откуда:
Сообщений: 23
Nickolay-123, в самом скрипте, что необходимо взять в []? [@DBName]?
20 ноя 17, 13:16    [20968927]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36889
davydovk
Nickolay-123, в самом скрипте, что необходимо взять в []? [@DBName]?
Нужно прочитать в хелпе про функцию quotename() и начать ее использовать.

Сообщение было отредактировано: 20 ноя 17, 13:20
20 ноя 17, 13:19    [20968940]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
Nickolay-123
Member

Откуда:
Сообщений: 21
Вы должны сформировать имя базы в квадратных скобках. Делайте это где угодно, хоть в скрипте, хоть в powershell
20 ноя 17, 13:20    [20968942]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
davydovk
Member

Откуда:
Сообщений: 23
Nickolay-123, подскажите, пожалуйста, на примере данного скрипта.
20 ноя 17, 13:24    [20968965]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
davydovk
Member

Откуда:
Сообщений: 23
Гавриленко Сергей Алексеевич, спасибо, почитаю
20 ноя 17, 13:26    [20968976]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
Nickolay-123
Member

Откуда:
Сообщений: 21
davydovk
Nickolay-123, подскажите, пожалуйста, на примере данного скрипта.

SET @DBName = quotename(@DBName)
20 ноя 17, 13:36    [20969029]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Nickolay-123
davydovk
Nickolay-123, подскажите, пожалуйста, на примере данного скрипта.

SET @DBName = quotename(@DBName)
Только @DBName должен быть типа sysname, который сегодня соответствует NVARCHAR(128).

Текст же скрипта по-любому будет преобразовываться в NVARCHAR(MAX).
Может, с самого начала применять этот тип для DSQL? Чтобы не было неявного приведения типов.
20 ноя 17, 13:39    [20969038]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
QUOTENAME(), однако работает именно с sysname и возвращает результат этого же типа.
20 ноя 17, 13:41    [20969041]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
davydovk
Member

Откуда:
Сообщений: 23
Nickolay-123,

Добавил в скрипт строчку:

SET @DBName = quotename(@DBName)


Теперь такие ошибки выдает:

Changed database context to 'master'.
Msg 102, Level 15, State 1, Server VM-EDIC-TAN, Line 1
Incorrect syntax near '-'.
Msg 319, Level 15, State 1, Server VM-EDIC-TAN, Line 1
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
Msg 102, Level 15, State 1, Server VM-EDIC-TAN, Line 1
Incorrect syntax near 'IMMEDIATE'.
База переведена в монопольный режиме

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RESTORE FILELISTONLY FROM DISK = N'D:\Backup\CDOP-5114\CDOP-5114_21-11-2017.bak' WITH FILE = 1;

(1 rows affected)
Msg 3201, Level 16, State 2, Server VM-EDIC-TAN, Line 1
Cannot open backup device 'D:\Backup\CDOP-5114\CDOP-5114_21-11-2017.bak'. Operating system error 3(The system cannot find the path specified.).
Msg 3013, Level 16, State 1, Server VM-EDIC-TAN, Line 1
RESTORE FILELIST is terminating abnormally.

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RESTORE DATABASE CDOP-5114 FROM DISK = N'D:\Backup\v82Doc_Works\v82Doc_Works_21-11-2017.bak' WITH FILE = 1,
MOVE N'CDOP-5114' TO N'E:\DATA\CDOP-5114.mdf', MOVE N'CDOP-5114_log' TO N'U:\LOG\CDOP-5114_log.ldf', NOUNLOAD, REPLACE, STATS = 5

(1 rows affected)
Msg 102, Level 15, State 1, Server VM-EDIC-TAN, Line 1
Incorrect syntax near '-'.
Msg 319, Level 15, State 1, Server VM-EDIC-TAN, Line 1
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
База восстановлена
Msg 911, Level 16, State 1, Server VM-EDIC-TAN, Line 1
Database 'CDOP' does not exist. Make sure that the name is entered correctly.
21 ноя 17, 11:23    [20971475]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
сделайте принт перед каждым EXEC-ом.
что в EXEC-е, то сперва пусть выводится в принте.
и вот когда вам напечатается неверный стэйтмент, после которого эта самая ошибка,
вы его сюда опубликуйте.
не всю тучу кода, а тот самый стэйтмент, что с ошибкой падает
21 ноя 17, 11:29    [20971510]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
davydovk
Member

Откуда:
Сообщений: 23
Yasha123, сделал, как Вы сказали, вот, что получилось:

Msg 102, Level 15, State 1, Server VM-EDIC-TAN, Line 1
Incorrect syntax near '-'.
Msg 319, Level 15, State 1, Server VM-EDIC-TAN, Line 1
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
Msg 102, Level 15, State 1, Server VM-EDIC-TAN, Line 1
Incorrect syntax near 'IMMEDIATE'.
21 ноя 17, 12:06    [20971707]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
Nickolay-123
Member

Откуда:
Сообщений: 21
davydovk
Yasha123, сделал, как Вы сказали, вот, что получилось:


Нет, вы не сделали, что вам сказали.
21 ноя 17, 12:11    [20971725]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
davydovk,

Попробуйте так.

USE [master]
GO
DECLARE @DBName nvarchar(50), @DBNameBackup nvarchar(50), @DBName_mdf varchar(500),  @DBName_ldf varchar(500), @MyDBNamelog varchar(500);
DECLARE @InstallDbPath nvarchar(max), @InstallDbPathLog nvarchar(max), @RestoreDbPath nvarchar(max), @RestoreDbPathLog nvarchar(max), @DBNamelog nvarchar(max),@BackupFolder nvarchar(max), @FullBackupPath nvarchar(max), @BackupFolderRecovery nvarchar(max), @FullBackupPathRecovery nvarchar(max);
--Формирование даты для бэкапа
DECLARE @BackupDate nvarchar(max) = CONVERT(varchar(10),GETDATE(),105);
--Каталог для бэкапа
DECLARE @BackupPath nvarchar(500) = 'D:\Backup';
SET @DBName = '$(varDBdatabase_recovery)';  --'$(varDBName)';  -- параметр из PowerShell
SET @DBNameBackup = '$(varDBdatabase_backup)';--'$(varDBNameBackup)';  -- параметр из PowerShell

SET @InstallDbPath = 'E:\DATA\' + @DBName + '.mdf';--база в которую заливаем
SET @InstallDbPathLog = 'U:\LOG\' + @DBName + '_log.ldf';
SET @RestoreDbPath = 'E:\DATA\' + @DBNameBackup + '.mdf';--база из которой заливаем
SET @RestoreDbPathLog = 'U:\LOG\' + @DBNameBackup + '_log.ldf';
SET @DBNamelog = @DBName+'_log';

Declare @SQLCmd as nvarchar(max);
Declare @SQLCmd5 as nvarchar(max);

IF EXISTS ( SELECT * FROM sysdatabases WHERE name = @DBName)
BEGIN
	Declare @SQLCmd1 as nvarchar(max);
	set @SQLCmd1 = 'USE master; ALTER DATABASE ' + convert(nvarchar(MAX),quotename(@DBName)) + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE'; 
	exec (@SQLCmd1);
	PRINT N'База переведена в монопольный режиме';
	
	SET @BackupFolder = @BackupPath + '\' + @DBNameBackup;
    SET @FullBackupPath = @BackupFolder + '\' + @DBNameBackup + '_' + @BackupDate + '.bak';
	SET @BackupFolderRecovery = @BackupPath + '\' + @DBName;
	SET @FullBackupPathRecovery = @BackupFolderRecovery + '\' + @DBName + '_' + @BackupDate + '.bak';
	--PRINT N'База существует';
    
	set @SQLCmd5 = 'RESTORE FILELISTONLY FROM DISK = N''' + @FullBackupPathRecovery + ''' WITH  FILE = 1;'
	select @SQLCmd5;
    exec (@SQLCmd5);
	
	set @SQLCmd = 'RESTORE DATABASE ' + convert(nvarchar(MAX),quotename(@DBName)) + ' FROM  DISK = N''' + @FullBackupPath + ''' WITH  FILE = 1,  
	MOVE N'''+@DBName+''' TO N'''+@InstallDbPath+''',  MOVE N'''+@DBNamelog+''' TO N'''+@InstallDbPathLog+''',  NOUNLOAD,  REPLACE,  STATS = 5';
	select @SQLCmd;
	exec (@SQLCmd);
	PRINT N'База восстановлена';
	
	Declare @SQLCmd2_2 as nvarchar(max);
	set @SQLCmd2_2 = 'USE ' + convert(nvarchar(MAX),quotename(@DBName)) + '; CREATE USER [user1c_ats] FOR LOGIN [user1c_ats] WITH DEFAULT_SCHEMA=[dbo]'; 
	exec (@SQLCmd2_2);
	PRINT N'Создали пользователя user1c_ats у базы - '+ @DBName;
	
	Declare @SQLCmd2 as nvarchar(max);
	set @SQLCmd2 = 'USE ' + convert(nvarchar(MAX),quotename(@DBName)) + '; exec sp_changedbowner ''user1c_ats'''; 
	exec (@SQLCmd2);
    PRINT N'Пользователя user1c_ats сделали владельцем базы';
	
	Declare @SQLCmd2_1 as nvarchar(max);
	set @SQLCmd2_1 = 'USE ' + convert(nvarchar(MAX),quotename(@DBName)) + '; ALTER ROLE db_owner ADD MEMBER user1c_ats'; 
	exec (@SQLCmd2_1);
    PRINT N'У пользователя user1c_ats добавили права db_owner к базе';
	
	Declare @SQLCmd3 as nvarchar(max);
	set @SQLCmd3 = 'USE master; ALTER DATABASE ' + convert(nvarchar(MAX),quotename(@DBName)) + ' SET MULTI_USER'; 
	
	exec (@SQLCmd3);
	
	Declare @SQLCmd4 as nvarchar(max);
	set @SQLCmd4 = 'USE master; ALTER DATABASE ' + convert(nvarchar(MAX),quotename(@DBName)) + ' SET RECOVERY SIMPLE'; 
	exec (@SQLCmd4);
	--ALTER DATABASE [@DBName] SET MULTI_USER
	PRINT N'База переведена в многопользовательский режим';
	--ALTER DATABASE [@DBName] SET RECOVERY SIMPLE
    PRINT N'Режим восстановления базы переведен в Simple';
	
	Declare @SQLCmd6 as nvarchar(max);
	set @SQLCmd6 = 'USE ' + convert(nvarchar(MAX),quotename(@DBName))+ '; ALTER DATABASE ' + @DBName + ' MODIFY FILE (NAME=' + @DBNameBackup + ', NEWNAME=' + @DBName + ')'; 
	exec (@SQLCmd6);
	Declare @SQLCmd7 as nvarchar(max);
	set @SQLCmd7 = 'USE ' + convert(nvarchar(MAX),quotename(@DBName)) + '; ALTER DATABASE ' + @DBName + ' MODIFY FILE (NAME=' + @DBNameBackup + '_log, NEWNAME=' + @DBName + '_log)'; 
	exec (@SQLCmd7);
	PRINT N'Изменили логические имена файлов';
	
	
END
ELSE
BEGIN
	PRINT N'База не существует';
END
21 ноя 17, 12:14    [20971739]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
davydovk
Member

Откуда:
Сообщений: 23
Andy_OLAP, Спасибо большое. Скрипт отработал, только в части:

Все хорошо:

Declare @SQLCmd6 as nvarchar(max);
	set @SQLCmd6 = 'USE ' + convert(nvarchar(MAX),quotename(@DBName))+ '; ALTER DATABASE ' + convert(nvarchar(MAX),quotename(@DBName)) + ' MODIFY FILE (NAME=' + @DBNameBackup + ', NEWNAME=' + convert(nvarchar(MAX),quotename(@DBName)) + ')'; 
	exec (@SQLCmd6);


Не отработал:

Declare @SQLCmd7 as nvarchar(max);
	set @SQLCmd7 = 'USE ' + convert(nvarchar(MAX),quotename(@DBName)) + '; ALTER DATABASE ' + convert(nvarchar(MAX),quotename(@DBName)) + ' MODIFY FILE (NAME=' + @DBNameBackup + '_log, NEWNAME=' + convert(nvarchar(MAX),quotename(@DBName)) + '_log)'; 
	PRINT N'Изменили логические имена файлов';
	exec (@SQLCmd7);


Выдает ошибку:

Msg 153, Level 15, State 1, Server VM-EDIC-TAN, Line 1
Invalid usage of the option _log in the CREATE/ALTER DATABASE statement.
21 ноя 17, 18:08    [20973137]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
davydovk,

convert(nvarchar(MAX),quotename(@DBName)) + '_log)'
на
convert(nvarchar(MAX),quotename(@DBName+'_log')) + ')'
21 ноя 17, 18:12    [20973150]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
davydovk,

Пожалуйста, только посмотрите внимательно " NEWNAME=' + convert(nvarchar(MAX),quotename(@DBName)) + '_log) " - я тут не просто так не стал название файла брать в скобки. Где используется обращение к БД - там скобки, где имена файлов и логические пути - просто @DBNAme, без quotename().
21 ноя 17, 18:13    [20973155]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
davydovk
Member

Откуда:
Сообщений: 23
Andy_OLAP
davydovk,

Пожалуйста, только посмотрите внимательно " NEWNAME=' + convert(nvarchar(MAX),quotename(@DBName)) + '_log) " - я тут не просто так не стал название файла брать в скобки. Где используется обращение к БД - там скобки, где имена файлов и логические пути - просто @DBNAme, без quotename().


Andy_OLAP, Я сначала так пробовал, выскакивала ошибка "Incorrect syntax near '-'", поэтому решил и там поменять @DBname на convert(nvarchar(MAX),quotename(@DBName))
21 ноя 17, 18:45    [20973248]     Ответить | Цитировать Сообщить модератору
 Re: Incorrect syntax near '-'  [new]
davydovk
Member

Откуда:
Сообщений: 23
TaPaK
davydovk,

convert(nvarchar(MAX),quotename(@DBName)) + '_log)'
на
convert(nvarchar(MAX),quotename(@DBName+'_log')) + ')'


TaPaK, вот так получилось.
Всем спасибо большое за помощь!
21 ноя 17, 18:51    [20973265]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить