संपूर्ण स्क्रिप्ट को एक टेम्पलेट स्ट्रिंग में रखें, {SERVERNAME} प्लेसहोल्डर्स के साथ। फिर स्ट्रिंग का उपयोग करके संपादित करें:
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
और फिर इसे चलाएं
EXECUTE (@SQL_SCRIPT)
यह विश्वास करना कठिन है कि, तीन वर्षों के दौरान, किसी ने यह नहीं देखा कि मेरा कोड काम नहीं करता है !
आप EXECकई बैच नहीं कर सकते । GOएक बैच विभाजक है, टी-एसक्यूएल स्टेटमेंट नहीं। तीन अलग-अलग तारों का निर्माण करना आवश्यक है, और फिर 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)