Как использовать переменную для имени базы данных в T-SQL? - PullRequest
116 голосов
/ 08 апреля 2009

Я использую имя базы данных в нескольких местах в моем скрипте, и я хочу иметь возможность быстро изменить его, поэтому я ищу что-то вроде этого:

DECLARE @DBNAME VARCHAR(50)
SET @DBNAME = 'TEST'

CREATE DATABASE @DBNAME
GO
ALTER DATABASE @DBNAME SET COMPATIBILITY_LEVEL = 90
GO
ALTER DATABASE @DBNAME SET RECOVERY SIMPLE 
GO

Но это не работает. Так как правильно написать этот код?

Ответы [ 4 ]

127 голосов
/ 08 апреля 2009

Поместите весь скрипт в строку шаблона с заполнителями {SERVERNAME}. Затем отредактируйте строку, используя:

SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)

и запустите его с

EXECUTE (@SQL_SCRIPT)

Трудно поверить, что в течение трех лет никто не заметил, что мой код не работает !

Вы не можете EXEC несколько партий. GO является разделителем пакетов, а не оператором T-SQL. Необходимо построить три отдельные строки, а затем EXEC каждая после замены.

Полагаю, можно сделать что-то «умное», разбив одну строку шаблона на несколько строк, разбив на GO; Я сделал это в коде ADO.NET.

А откуда я взял слово "ИМЯ СЕРВЕРА"?

Вот код, который я только что протестировал (и который работает):

DECLARE @DBNAME VARCHAR(255)
SET @DBNAME = 'TestDB'

DECLARE @CREATE_TEMPLATE VARCHAR(MAX)
DECLARE @COMPAT_TEMPLATE VARCHAR(MAX)
DECLARE @RECOVERY_TEMPLATE VARCHAR(MAX)

SET @CREATE_TEMPLATE = 'CREATE DATABASE {DBNAME}'
SET @COMPAT_TEMPLATE='ALTER DATABASE {DBNAME} SET COMPATIBILITY_LEVEL = 90'
SET @RECOVERY_TEMPLATE='ALTER DATABASE {DBNAME} SET RECOVERY SIMPLE'

DECLARE @SQL_SCRIPT VARCHAR(MAX)

SET @SQL_SCRIPT = REPLACE(@CREATE_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)

SET @SQL_SCRIPT = REPLACE(@COMPAT_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)

SET @SQL_SCRIPT = REPLACE(@RECOVERY_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)
96 голосов
/ 11 февраля 2012

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

:setvar dbname "TEST" 

CREATE DATABASE $(dbname)
GO
ALTER DATABASE $(dbname) SET COMPATIBILITY_LEVEL = 90
GO
ALTER DATABASE $(dbname) SET RECOVERY SIMPLE 
GO

EDIT:

Проверьте эту статью MSDN , чтобы установить параметры с помощью инструмента SQLCMD.

10 голосов
/ 08 апреля 2009

К сожалению, вы не можете объявить имена баз данных с переменной в этом формате.

Для того, что вы пытаетесь достичь, вам нужно будет обернуть свои утверждения в оператор EXEC (). Так что у вас будет что-то вроде:

DECLARE @Sql varchar(max) ='CREATE DATABASE ' + @DBNAME

Тогда звоните

EXECUTE(@Sql) or sp_executesql(@Sql)

для выполнения строки sql.

5 голосов
/ 08 апреля 2009

Нельзя использовать переменную в операторе создания таблицы. Лучшее, что я могу предложить, - написать весь запрос в виде строки и выполнить его.

Попробуйте что-то вроде этого:

declare @query varchar(max);
set @query = 'create database TEST...';

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