2009-04-07 1 views
107

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

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 

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

+0

Динамический SQL ..... –

ответ

114

Поместите весь скрипт в строку шаблона с помощью заполнителей {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

+1 Очень хороший подход ... Ты просто спас меня от тонны работы, тх ... Хотя это должно быть EXECUTE (@SQL_SCRIPT), или, по крайней мере, это то, что сработало для меня. – reSPAWNed

+2

Нужно быть осторожным с побегом. – usr

+4

'SYSNAME' будет более подходящим типом данных, чем' VARCHAR (255) 'также должен использовать' QUOTENAME' для обработки всех возможных имен баз данных (и, возможно, для предотвращения внедрения SQL в зависимости от источника имени) –

5

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

попробовать что-то вроде этого:

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

exec (@query); 
9

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

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

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

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

EXECUTE(@Sql) or sp_executesql(@Sql) 

для выполнения SQL-строку.

+0

'EXEC' ищет хранимую процедуру. В этом случае требуется «ВЫПОЛНИТЬ». –

+0

Спасибо @BobBlogge - я обновил его. –

+2

На самом деле мне нужно извиниться. Оказывается, «EXEC» и «EXECUTE» совпадают. Я сделал заявление после неудачи с 'EXEC' и преуспел с' EXECUTE'. Хотя, очевидно, моя настоящая проблема не была связана ни с одним из них. –

90

Вы можете также использовать режим 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.

+0

как этот метод может использовать уже объявленные переменные? Вместо «TEST» вы можете добавить @dbName? Я пробовал и не работал – syclee

+1

@syclee TSQL переменная? Никакие подстановки sqlcmd не выполняются до того, как скрипт даже отправлен на сервер. –

+0

@MartinSmith Привет, я хочу, чтобы имя db было как команда OUTPUT. Итак, как я могу использовать SQLCMD? –

Смежные вопросы