Đặt toàn bộ tập lệnh vào một chuỗi mẫu, với trình giữ chỗ {SERVERNAME}. Sau đó, chỉnh sửa chuỗi bằng cách sử dụ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 suốt 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 phân tách hàng loạt, không phải là một câu lệnh T-SQL. Cần tạo ba chuỗi riêng biệt và sau đó đến EXEC
mỗi ngườ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 đã làm đ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à mã nào 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)