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

Откуда:
Сообщений: 4
В SQL Express делаю архив базы с помощью Запроса.
Если в список нужных баз попадает база с именем типа: "1cv82_hrm_demo_pav" то вылетает ошибка:
"Сообщение 102, уровень 15, состояние 1, строка 4
Неправильный синтаксис около конструкции "1". "

Что, как я понимаю, связанно с тем что имя базы начинается с цифры. Если способы решения проблемы без переименования БД?
Ниже кусок запроса, где возникает ошибка.

[FIXED]DECLARE NamebasesCursor CURSOR FOR SELECT name from master.dbo.sysdatabases WHERE NAME  IN ( '1cv82_hrm_demo_pav') --создаем курсор для имен баз из  sysdatabases 
OPEN NamebasesCursor --открываем курсор
WHILE 1=1 BEGIN --цикл 
FETCH   FROM  NamebasesCursor INTO @Namebase --получаем значение курсора в переменную

IF @@fetch_status=-1 begin --если дошли до конца 
BREAK --выход
end

IF @@fetch_status=-2 begin --если ошибка курсора
CONTINUE --продолжить
end

set @NameBcp=@Namebase+'_Backup'
set @StrExec=
'
USE master
EXEC sp_addumpdevice ''disk'', '''+@NameBcp+''', '''+@StrSaveDir+@Namebase+'.bak'' 
BACKUP DATABASE '+@Namebase+' TO '+@NameBcp+' 
exec sp_dropdevice '''+@NameBcp+'''
'
--print  @StrExec
EXEC(@StrExec)
set @CntBcp=@CntBcp+1
END -- конец цикла
[/FIXED]
20 авг 15, 10:24    [18044160]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с обходом баз данных, имя которых начинается с цифры.  [new]
iap
Member

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

QUOTENAME(@Namebase)
Имена объектов заключать в квадратные скобки
20 авг 15, 10:26    [18044179]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с обходом баз данных, имя которых начинается с цифры.  [new]
AnyKey45
Member

Откуда: Ekaterinburg-Moscow-EU
Сообщений: 219
tavern,

[имя базы]
20 авг 15, 10:27    [18044181]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с обходом баз данных, имя которых начинается с цифры.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
AnyKey45
tavern,

[имя базы]
В общем случае некорректно, ибо внутри имени базы теоретически могут быть квадратные скобки
20 авг 15, 10:28    [18044192]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с обходом баз данных, имя которых начинается с цифры.  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
SELECT QUOTENAME('[[test')


не вариант?
20 авг 15, 11:23    [18044591]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с обходом баз данных, имя которых начинается с цифры.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
AlanDenton
SELECT QUOTENAME('[[test')



не вариант?
Не. Это баян
20 авг 15, 11:30    [18044646]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с обходом баз данных, имя которых начинается с цифры.  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE 
	  @db_name SYSNAME
	, @path NVARCHAR(4000)
	, @date DATE = GETDATE()
	, @SQL NVARCHAR(MAX)

EXEC master.dbo.xp_instance_regread 
	N'HKEY_LOCAL_MACHINE',
	N'Software\Microsoft\MSSQLServer\MSSQLServer',
	N'BackupDirectory', @path OUTPUT, 'no_output'

DECLARE cur CURSOR FAST_FORWARD READ_ONLY LOCAL FOR
	SELECT name
	FROM sys.databases
	WHERE [state] = 0
		AND name NOT IN ('tempdb', 'InputData')

OPEN cur

FETCH NEXT FROM cur INTO @db_name

WHILE @@FETCH_STATUS = 0 BEGIN

	IF DB_ID(@db_name) IS NOT NULL AND DATABASEPROPERTYEX (@db_name, 'Status') = 'ONLINE' BEGIN  

		SET @SQL = 'BACKUP DATABASE ' + QUOTENAME(@db_name) + ' TO DISK = ''' + @path + '\T'
			 + CONVERT(VARCHAR(10), @date, 112) + '_' + @db_name + '.bak'' WITH INIT, FORMAT, COMPRESSION;'
		
		--PRINT @SQL
		EXEC sys.sp_executesql @SQL
    	
	END

	FETCH NEXT FROM cur INTO @db_name

END

CLOSE cur
DEALLOCATE cur
20 авг 15, 11:33    [18044668]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с обходом баз данных, имя которых начинается с цифры.  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
@iap, точно мне в отпуск пора :)
20 авг 15, 11:34    [18044681]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с обходом баз данных, имя которых начинается с цифры.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
AlanDenton
@iap, точно мне в отпуск пора :)
Не понял. Это сейчас меня собакой обозвали?


По делу: в последнем скрипте надо расставить N перед юникодными литеральными строками...
На всякий случай
20 авг 15, 11:44    [18044764]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с обходом баз данных, имя которых начинается с цифры.  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Нет конечно :) то привычка еще со stackoverflow осталась :)
20 авг 15, 11:52    [18044828]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с обходом баз данных, имя которых начинается с цифры.  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
+ забыл добавить что в скрипте "COMPRESSION" будет ругаться... помнится что данная фича на экспрессе не поддерживается
20 авг 15, 11:54    [18044842]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с обходом баз данных, имя которых начинается с цифры.  [new]
tavern
Member

Откуда:
Сообщений: 4
AlanDenton, спасибо.

Приспособил кусок под свои нужды:
OPEN cur

[src]FETCH NEXT FROM cur INTO @db_name

WHILE @@FETCH_STATUS = 0 BEGIN

	IF DB_ID(@db_name) IS NOT NULL AND DATABASEPROPERTYEX (@db_name, 'Status') = 'ONLINE' BEGIN  

		SET @SQL = 'BACKUP DATABASE ' + QUOTENAME(@db_name) + ' TO DISK = ''' + @path + '\T'
			 + CONVERT(VARCHAR(10), @date, 112) + '_' + @db_name + '.bak'' WITH INIT, FORMAT, COMPRESSION;'
		
		--PRINT @SQL
		EXEC sys.sp_executesql @SQL
    	
	END

	FETCH NEXT FROM cur INTO @db_name

END


Проблему решил.

Ради интереса, не понял почему, когда я обрабатываю имя базы в своем коде оператором QUOTENAME выходит ошибка.
20 авг 15, 14:52    [18046168]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с обходом баз данных, имя которых начинается с цифры.  [new]
o-o
Guest
tavern
AlanDenton, спасибо.

Приспособил кусок под свои нужды:
OPEN cur

[src]FETCH NEXT FROM cur INTO @db_name

WHILE @@FETCH_STATUS = 0 BEGIN

	IF DB_ID(@db_name) IS NOT NULL AND DATABASEPROPERTYEX (@db_name, 'Status') = 'ONLINE' BEGIN  

		SET @SQL = 'BACKUP DATABASE ' + QUOTENAME(@db_name) + ' TO DISK = ''' + @path + '\T'
			 + CONVERT(VARCHAR(10), @date, 112) + '_' + @db_name + '.bak'' WITH INIT, FORMAT, COMPRESSION;'
		
		--PRINT @SQL
		EXEC sys.sp_executesql @SQL
    	
	END

	FETCH NEXT FROM cur INTO @db_name

END


Проблему решил.

Ради интереса, не понял почему, когда я обрабатываю имя базы в своем коде оператором QUOTENAME выходит ошибка.

в своем коде 18044160 вы НЕ используете QUOTENAME().
его использует AlanDenton,
и вы, переделав под себя его код и оставив в нем QUOTENAME(),
ошибку не получаете:
tavern
Проблему решил.

тогда о чем ваш вопрос сейчас?
20 авг 15, 15:06    [18046280]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с обходом баз данных, имя которых начинается с цифры.  [new]
o-o
Guest
ваш курсор формирует команды типа такой
BACKUP DATABASE 1cv82_hrm_demo_pav TO disk = '...'

выполните такое или нажмите parse.
получите то самое

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '1'.


а вам надо получать команды типа
BACKUP DATABASE [1cv82_hrm_demo_pav] TO disk = '...'

и это делает quotename().
а в вашем коде его не было
20 авг 15, 15:19    [18046393]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с обходом баз данных, имя которых начинается с цифры.  [new]
tavern
Member

Откуда:
Сообщений: 4
Я у себя в запросе добавил QUOTENAME, но все равно не работало из-за строки:

set @NameBcp=@Namebase+'_Backup'

поменял на
set @NameBcp='Backup_'+@Namebase


все заработало.

Всем спасибо за помощь.
28 авг 15, 15:30    [18081988]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить