2012-02-06 11 views
9

के माध्यम से वर्तमान डेटाबेस बदलें I SQL Server 2008 का उपयोग कर रहा हूं और वर्तमान डेटाबेस नाम को एक चर में बदलने की कोशिश कर रहा हूं। मैं आमतौर पर यह स्टेटमेंट USE myDatabaseName के साथ स्पष्ट रूप से करता हूं। प्रश्न उठता है क्योंकि यदि मैं एक स्क्रिप्ट चला रहा हूं और यदि मैं डेटाबेस नाम नहीं बदलता तो यह [master] डेटाबेस में सभी तालिकाएं बनाता है।SQL सर्वर: परिवर्तनीय

मैंने निम्नलिखित की कोशिश की लेकिन ऐसा लगता है कि यह create tables कोड को [master] पर लागू करता रहता है।

DECLARE @dbName CHAR(50) 
DECLARE @SqlQuery varchar(50) 
SET @dbName = 'MyNewDatabaseName' 

IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = @dbName) 
BEGIN 
    SELECT @SqlQuery = 'CREATE DATABASE ' + @dbName + 'COLLATE SQL_Latin1_General_CP1_CI_AS' 
    EXEC(@SqlQuery) 
END 

Select @SqlQuery = 'Use ' + @dbName 
EXEC(@SqlQuery) 
go 
+0

आप स्क्रिप्ट कैसे चला रहे हैं? –

+0

सर्वर स्तर पर 'नई क्वेरी' के रूप में। – Rick

उत्तर

12

गतिशील एसक्यूएल में USE some_db निष्पादित काम करता है लेकिन दुर्भाग्य से जब दायरे से बाहर निकलता डेटाबेस संदर्भ क्या यह मूल रूप से था वापस करने के लिए बदल जाती है।

आप इसके लिए sqlcmd मोड का उपयोग कर सकते हैं (इसे प्रबंधन स्टूडियो में "क्वेरी" मेनू पर सक्षम करें)।

:setvar dbname "MyNewDatabaseName" 

IF DB_ID('$(dbname)') IS NULL 
    BEGIN 

    DECLARE @SqlQuery NVARCHAR(1000); 
    SET @SqlQuery = N'CREATE DATABASE ' + QUOTENAME('$(dbname)') + ' 
      COLLATE SQL_Latin1_General_CP1_CI_AS' 
    EXEC(@SqlQuery) 

    END 

GO 

USE $(dbname) 

GO 
+0

+1 - यह वास्तव में (या, अच्छी तरह से, बहुत करीब है) जो मैं जवाब दे रहा था। लेकिन आप वास्तव में तेज़ हैं :-) – Lamak

+0

क्या एक ही क्वेरी में 'sqlcmd' मोड से डायनामिक एसक्यूएल में बदलना संभव है? – Rick

+2

@ रिक - 'sqlcmd' मोड सक्षम होने से आपको किसी भी SQL संरचना का उपयोग करने से रोका नहीं जाता है। कमांड SQL सर्वर पर सबमिट करने से पहले क्लाइंट टूल्स वेरिएबल प्रतिस्थापन करते हैं। –

0

यह गतिशील एसक्यूएल के माध्यम से किया जा सकता है। dbname स्टोर करने के लिए एक चर का उपयोग और उसके बाद EXEC() या sp_executesql का उपयोग एसक्यूएल स्ट्रिंग निष्पादित करने के लिए इस तरह चर का उपयोग

SELECT @Sql ='SELECT fields FROM ' + @dbname +'.Table' 

एक एसक्यूएल स्ट्रिंग बनाने के लिए।

2

बस, मार्टिन स्मिथ के जवाब जोड़ने के लिए

यह इतना है आप एक से अधिक डेटाबेस के लिए अपने टेबल निर्माण या तालिका संशोधन तैनात कर सकते हैं आप अपने डाटाबेस निर्माण और वस्तु निर्माण स्क्रिप्ट अलग कर सकते हैं, और फिर एक का उपयोग कर अनुक्रम में उन्हें चलाने input file -i का उपयोग कर बल्ले फ़ाइल। यह आपको मास्टर से नए डेटाबेस में स्क्रिप्ट के बीच डेटाबेस बदलने में सक्षम बनाता है।

तो अपने बैच फ़ाइल

sqlcmd -S server\Instance -E -i createdatabase.sql 
sqlcmd -S server\Instance -E -d MyNewDatabaseName -i CreateTables.sql 

आमतौर पर फिर भी मैं केवल जब मैं विभिन्न डेटाबेस में परिवर्तन की तैनाती की गई थी यह करने के लिए की जरूरत है (क्यों नहीं पूछते) हो सकता है जैसे

sqlcmd -S server\Instance -E -d OneDatabase -i CreateTables.sql 
sqlcmd -S server\Instance -E -d AnotherDatabase -i CreateTables.sql