Đặt toàn bộ tập lệnh vào một chuỗi mẫu, với các trình giữ chỗ {SERVERNAME}. Sau đó chỉnh sửa chuỗi bằng:
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
và sau đó chạy nó với
EXECUTE (@SQL_SCRIPT)
Thật khó để tin rằng, trong ba năm, không ai nhận thấy rằng mã của tôi không hoạt động !
Bạn không thể EXEC
nhiều đợt. GO
là một dấu tách hàng loạt, không phải là câu lệnh T-SQL. Cần phải xây dựng ba chuỗi riêng biệt, sau đó đến EXEC
từng chuỗi sau khi thay thế.
Tôi cho rằng người ta có thể làm điều gì đó "thông minh" bằng cách chia chuỗi mẫu đơn thành nhiều hàng bằng cách tách trên GO
; Tôi đã thực hiện điều đó trong mã ADO.NET.
Và tôi đã lấy từ "SERVERNAME" từ đâu?
Đây là một số mã mà tôi vừa thử nghiệm (và nó hoạt động):
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)