Поместите весь сценарий в строку шаблона с заполнителями {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)
SYSNAME
был бы более подходящим типом данных, чемVARCHAR(255)
также следует использоватьQUOTENAME
для работы со всеми возможными именами баз данных (и, возможно, для предотвращения SQL-инъекций в зависимости от источника имени)CREATE SCHEMA
другую базу данныхUSE {DBNAME}
. Схема создается в неправильной базе данных; /Вы также можете использовать
sqlcmd
для этого режим (включите его в меню «Запрос» в Management Studio).РЕДАКТИРОВАТЬ:
Ознакомьтесь с этой статьей MSDN, чтобы установить параметры с помощью инструмента SQLCMD.
источник
К сожалению, вы не можете объявить имена баз данных с помощью переменной в этом формате.
Для того, что вы пытаетесь выполнить, вам нужно будет заключить свои операторы в оператор EXEC (). Итак, у вас будет что-то вроде:
Тогда позвони
для выполнения строки sql.
источник
EXEC
ищет хранимую процедуру. В этом случаеEXECUTE
это необходимо.EXEC
иEXECUTE
такие же. Я сделал заявление после того, как потерпел неудачуEXEC
и преуспел в этомEXECUTE
. Хотя очевидно, что моя настоящая проблема ни с одним из них не связана.Вы не можете использовать переменную в операторе создания таблицы. Лучшее, что я могу предложить, - это написать весь запрос в виде строки и выполнить ее.
Попробуйте что-то вроде этого:
источник