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

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

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

Но это не сработает. Итак, какой правильный способ написать этот код?

Ответ 1

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

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

а затем запустите его с помощью

EXECUTE (@SQL_SCRIPT)

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

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

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

И откуда я получил слово "SERVERNAME" из?

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

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)

Ответ 2

Вы также можете использовать sqlcmd для этого (включите это в меню "Запрос" в Studio 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.

Ответ 3

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

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

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

Затем вызовите

EXECUTE(@Sql) or sp_executesql(@Sql)

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

Ответ 4

Вы не можете использовать переменную в инструкции create table. Самое лучшее, что я могу предложить, - написать весь запрос в виде строки и выполнить это.

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

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

exec (@query);