SQL Server: изменить текущую базу данных через переменную - PullRequest
9 голосов
/ 06 февраля 2012

Я использую SQL Server 2008 и пытаюсь изменить текущее имя базы данных на одно в переменной.Я обычно делаю это явно с пометкой USE myDatabaseName.Возникает вопрос, потому что, если я запускаю скрипт и если я не изменяю имя базы данных, он создает все таблицы в базе данных [master].

Я попробовал следующее, но, похоже, не работает какон продолжает применять остальные коды create tables к [master].

DECLARE @dbName CHAR(50)
DECLARE @SqlQuery varchar(50)
SET @dbName = 'MyNewDatabaseName'

IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = @dbName)
BEGIN
    SELECT @SqlQuery = 'CREATE DATABASE ' + @dbName + 'COLLATE SQL_Latin1_General_CP1_CI_AS'
    EXEC(@SqlQuery) 
END

Select @SqlQuery = 'Use ' + @dbName
EXEC(@SqlQuery)
go

Ответы [ 3 ]

13 голосов
/ 06 февраля 2012

Выполнение USE some_db в динамическом SQL работает, но, к сожалению, когда область выходит из области действия, контекст базы данных возвращается к тому, что был изначально.

Для этого можно использовать режим sqlcmd (включите его в меню «Запрос» в Management Studio).

:setvar dbname "MyNewDatabaseName" 

IF DB_ID('$(dbname)') IS NULL
    BEGIN

    DECLARE @SqlQuery NVARCHAR(1000);
    SET @SqlQuery = N'CREATE DATABASE ' + QUOTENAME('$(dbname)') + ' 
            COLLATE SQL_Latin1_General_CP1_CI_AS'
    EXEC(@SqlQuery) 

    END

GO

USE $(dbname)

GO
3 голосов
/ 07 февраля 2012

Просто чтобы добавить ответ Мартина Смита,

Если это так, вы можете развернуть создание таблицы или модификацию таблицы в нескольких базах данных, вы можете разделить сценарии создания базы данных и создания объекта, а затем запустить их последовательно, используяфайл bat с использованием input file -i.Это позволяет вам изменять базы данных между сценариями с главной на новую базу данных.

тогда ваш пакетный файл может

 sqlcmd -S server\Instance -E -i createdatabase.sql 
 sqlcmd -S server\Instance -E -d MyNewDatabaseName -i CreateTables.sql 

Обычно, однако, мне нужно было делать это только при развертывании изменений.к нескольким базам данных (не спрашивайте почему) например

 sqlcmd -S server\Instance -E -d OneDatabase -i CreateTables.sql 
 sqlcmd -S server\Instance -E -d AnotherDatabase -i CreateTables.sql 
0 голосов
/ 06 февраля 2012

Это можно сделать с помощью динамического sql. используйте переменную для хранения dbname и используйте эту переменную для построения строки sql, например

SELECT @Sql ='SELECT fields FROM ' + @dbname +'.Table'

затем используйте EXEC() или sp_executesql для выполнения строки sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...