Я использую имя базы данных в нескольких местах в моем 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);