Letakkan seluruh skrip ke dalam string template, dengan placeholder {SERVERNAME}. Kemudian edit string menggunakan:
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
dan kemudian jalankan dengan
EXECUTE (@SQL_SCRIPT)
Sulit dipercaya bahwa, selama tiga tahun, tidak ada yang memperhatikan bahwa kode saya tidak berfungsi !
Anda tidak dapat melakukan EXEC
banyak kelompok. GO
adalah pemisah batch, bukan pernyataan T-SQL. Anda perlu membangun tiga string terpisah, lalu ke EXEC
masing - masing string setelah substitusi.
Saya kira seseorang dapat melakukan sesuatu yang "pintar" dengan memecah string template tunggal menjadi beberapa baris dengan membelah GO
; Saya telah melakukannya dalam kode ADO.NET.
Dan dari mana saya mendapatkan kata "SERVERNAME"?
Berikut beberapa kode yang baru saja saya uji (dan yang berfungsi):
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
akan menjadi tipe data yang lebih tepat daripada yangVARCHAR(255)
juga harus digunakanQUOTENAME
untuk menangani semua kemungkinan nama database (dan mungkin untuk mencegah injeksi SQL tergantung pada sumber nama)CREATE SCHEMA
di database lain, menggunakanUSE {DBNAME}
. Skema membuat dalam database yang salah; /Anda juga dapat menggunakan
sqlcmd
mode untuk ini (aktifkan ini pada menu "Query" di Management Studio).EDIT:
Periksa artikel MSDN ini untuk mengatur parameter melalui alat SQLCMD.
sumber
Sayangnya Anda tidak dapat mendeklarasikan nama database dengan variabel dalam format itu.
Untuk apa yang Anda coba capai, Anda perlu membungkus pernyataan Anda dalam pernyataan EXEC (). Jadi Anda akan memiliki sesuatu seperti:
Kemudian panggil
untuk mengeksekusi string sql.
sumber
EXEC
mencari prosedur yang tersimpan. Dalam halEXECUTE
ini dibutuhkan.EXEC
danEXECUTE
sama saja. Saya membuat pernyataan itu setelah gagalEXEC
dan berhasilEXECUTE
. Meskipun jelas masalah saya sebenarnya tidak terkait dengan keduanya.Anda tidak dapat menggunakan variabel dalam pernyataan buat tabel. Hal terbaik yang dapat saya sarankan adalah menulis seluruh kueri sebagai string dan mengeksekusinya.
Coba sesuatu seperti ini:
sumber