2014-09-02 2 views
3

Я написал сценарий, который генерирует имя файла резервной копии базы данных, создает резервную копию базы данных и затем восстанавливает ее как копию с новым именем базы данных. Имя основано на данных о дате/времени.EXEC для использования базы данных

Я тогда должен указать USE эту базу данных в сценарии, а затем отключить все триггеры.

Однако, это не работает:

DECLARE @Use VARCHAR(50) 
SET @Use = 'USE ' + @NewDatabaseName 

EXEC(@Use) 

Запуск вручную - база данных не получает 'USED'.

Как я могу выполнить оператор USE с переменной?

Я пробовал sp_executesql, а также с таким же результатом. База данных не изменилась.

DECLARE @sqlCommand nvarchar(1000) 
SET @sqlCommand = 'USE ' + @NewDatabaseName 

EXECUTE sp_executesql @sqlCommand 

Похоже, мне, возможно, понадобится войти в режим sqlcmd? На самом деле надеяться не на.

+0

вам нужно использовать sp_executesql – realnumber3012

+0

Я смотрел на это, но мне кажется, что ему нужно несколько параметров, и я боюсь понять, что они будут, в случае заявления USE. – Craig

+0

Просто интересно: ваше 'основанное на данных базы данных даты/времени? Превышает 46 символов? – cha

ответ

2

Оба exec и execute_sql работают в своем собственном объеме. И изменение в базе данных повлияет только на их собственную область. Таким образом, вы могли бы:

set @sql = 'use ' + quotename(@new_db_name) + '; disable trigger t1;' 
exec (@sql) 

Насколько я знаю, нет никакого способа изменить контекст базы данных текущей области к имени переменной базы данных.

+0

Yup , сделайте все в одном EXEC. Просто сделал это, увидев ваш первоначальный ответ. Благодарю. Узнал что-то сейчас. – Craig