2011-03-08 11 views
49

मेरे पास 10 ट्रांज़ेक्ट एसक्यूएल स्क्रिप्ट हैं जो प्रत्येक एक टेबल बनाते हैं और डेटा के साथ भरते हैं।एक और TransactSQL स्क्रिप्ट चलाने के लिए TransactSQL

मैं 1 मास्टर एसक्यूएल स्क्रिप्ट बनाने का प्रयास कर रहा हूं जो 10 अन्य स्क्रिप्ट्स को चलाएगा।

क्या मौजूदा SQL वर्ग स्क्रिप्ट के भीतर से एक और tsql स्क्रिप्ट निष्पादित करने के लिए Microsoft SQL Server 2008 के लिए TSQL/TRANSACTSQL के साथ कोई तरीका है?

यह एसक्यूएल सर्वर प्रबंधन स्टूडियो (एसएसएमएस) के माध्यम से चलाने का इरादा है।

धन्यवाद!

+1

जब आप कहते हैं स्क्रिप्ट आप एक sql फ़ाइल मतलब है? –

+1

हाँ, मेरा मतलब एक .sql फ़ाइल है। धन्यवाद! –

उत्तर

83

इस प्रयास करें यदि आप SSMS में एक sql फ़ाइल निष्पादित करने के लिए कोशिश कर रहे हैं:

:r C:\Scripts\Script1.sql 
:r C:\Scripts\Script2.sql 
:r C:\Scripts\Script3.sql 
... 

ध्यान दें: इस एसक्यूएल आदेश मोड पर बारी को चलाने के लिए (क्वेरी> SQLCMD मोड)

यदि इन कर रहे हैं स्क्रिप्ट आप काफी चालू रहता है लेकिन आप उन्हें एक संग्रहीत proc में छोड़ने और उन्हें इस तरह से चल रहा है पर विचार हो सकता ...

तुम भी sqlcmd के माध्यम से यह कर सकते हैं (जो मेरा मानना ​​है कि अधिक सामान्य है):

sqlcmd -S serverName\instanceName -i C:\Scripts\Script1.sql 
+3

'आर' क्या करता है? यह कहां दस्तावेज है? क्या आप एक लिंक प्रदान कर सकते हैं? – Oded

+34

नोट: एसएसएमएस में आर को SQLCMD मोड चालू करने की आवश्यकता है: क्वेरी मेनू -> SQLCMD मोड। –

+2

@ ओडेड, इसे एक पढ़ा दें: http://msdn.microsoft.com/en-us/library/ms174187.aspx ': r' आयात और फ़ाइल निष्पादित करता है। –

0

मान लीजिए कि आप अपनी व्यक्तिगत फाइलों में 10 स्क्रिप्ट्स रखना चाहते हैं, तो मैं आपको बैच फ़ाइल बनाने के लिए सबसे आसान तरीका कहूंगा जो आपको ऑर्डर में 10 स्क्रिप्ट निष्पादित करने के लिए osql.exe निष्पादित करता है। चाहते हैं।

+1

SQL 2005 और उसके बाद SQLCMD का उपयोग करने के लिए सर्वश्रेष्ठ। कुछ नए वाईफाई सुविधाओं के साथ-साथ सभी ओएसक्यूएल (और आईएसक्यूएल) सुविधाओं का समर्थन करता है। –

+0

@ फिलिप केली: टिप के लिए धन्यवाद। मुझे यकीन नहीं है कि मैं उसे कैसे याद करता हूं। मुझे लगता है क्योंकि मैं कमांड लाइन से ज्यादा नहीं करता हूं। –

+0

जब से मैंने आईएसक्ल और ओएसक्ल के बीच एक छिपे हुए लेकिन मौलिक अंतर को मारा, तब से जब मैं एक नया संस्करण लुढ़क जाता हूं तो मैं उन्हें बाहर देखता हूं –

3

आपकी स्क्रिप्ट को प्रक्रियाओं को संग्रहीत करने और कॉल करने के लिए सबसे आसान तरीका होगा (EXECUTE कमांड के माध्यम से) प्रत्येक प्रक्रिया को केंद्रीय प्रक्रिया से बदल दिया जाता है। यह आदर्श है यदि आप एक ही वही स्क्रिप्ट (बार) को बार-बार चलाने जा रहे हैं (या उसी पैरामीटर में पारित विभिन्न पैरामीटर के साथ)।

यदि आपकी स्क्रिप्ट्स .sql (या किसी भी प्रकार की टेक्स्ट) फ़ाइल हैं, तो @Abe Miesller कहता है (upvoted) आप उन्हें एसएसएमएस के भीतर से चला सकते हैं: r कमांड, जब SQLCMD मोड सक्षम है। आपको सटीक फ़ाइल पथ और नाम को जानना और स्क्रिप्ट करना होगा। यह एक संग्रहीत प्रक्रिया के भीतर से नहीं किया जा सकता है।

एक अंतिम विकल्प, "ज्ञात" फ़ाइल नामों के साथ प्रयोग योग्य और मनमानी फ़ाइल नामों के लिए जरूरी है (कहें, वर्तमान में सबफ़ोल्डर में लोड की गई सभी फाइलें) विस्तारित प्रक्रिया XP_CMDSHELL की शक्ति का लाभ उठाने के लिए है। इस तरह के समाधान compelx बहुत तेजी से प्राप्त कर सकते हैं (फ़ाइलों की सूची को पुनर्प्राप्त करने के लिए इसका उपयोग करें, xp_cmdshell के माध्यम से निर्माण और निष्पादित करें, प्रत्येक फ़ाइल के लिए SQLCMD को एक स्ट्रिंग कॉलिंग, आउटपुट फ़ाइलों के माध्यम से परिणाम और त्रुटियों का प्रबंधन करें, यह चालू और चालू होता है) इसलिए मैं केवल इसे अंतिम उपाय के रूप में करें।

3

आप ओएसक्ल या बेहतर अभी तक नए एसक्यूएलसीएमडी का उपयोग कर सकते हैं। मैं इस उदाहरण में ओएसक्ल का उपयोग कर रहा हूं क्योंकि मेरे पास कोड कोड नमूना हुआ था लेकिन उत्पादन में मैं sqlcmd का उपयोग कर रहा हूं। डाटाबेस के खिलाफ अद्यतन स्क्रिप्ट चलाने के लिए उपयोग की जाने वाली एक बड़ी प्रक्रिया के बाहर कोड का एक स्निप किया गया है। उन्हें प्रमुख, नाबालिग, रिलीज, बिल्डिंग द्वारा आदेश दिया जाता है क्योंकि रिलीज ट्रैक करने के लिए उस सम्मेलन का उपयोग करके मैं अपनी स्क्रिप्ट का नाम देता हूं। आप स्पष्ट रूप से मेरे सभी त्रुटि हैंडिंग को खो रहे हैं, जिन हिस्सों में मैं डेटाबेस, सेटअप चर, आदि से उपलब्ध स्क्रिप्ट खींचता हूं लेकिन आपको अभी भी यह स्निपेट उपयोगी हो सकता है।

ओएसक्ल या एसक्यूएलसीएमडी का उपयोग करने के बारे में मुझे मुख्य भाग यह है कि आप इस कोड को एसएसएमएस में चला सकते हैं, या संग्रहीत प्रक्रिया (जिसे निर्धारित समय पर बुलाया जा सकता है) या बैच फ़ाइल से चला सकते हैं। बहुत लचीला।

--Use cursor to run upgrade scripts 
DECLARE OSQL_cursor CURSOR 
READ_ONLY 
FOR SELECT FileName 
FROM #Scripts 
ORDER BY Major, Minor, Release, Build 

OPEN OSQL_cursor 

FETCH NEXT FROM OSQL_cursor INTO @name 
WHILE (@@fetch_status <> -1) 
BEGIN 
    IF ((@@fetch_status <> -2) AND (@result = 0)) 
    BEGIN 
     SET @CommandString = 'osql -S ' + @@ServerName + ' -E -n -b -d ' + @DbName + ' -i "' + @Dir + @name + '"' 
     EXEC @result = master.dbo.xp_cmdshell @CommandString, NO_OUTPUT 
     IF (@result = 0) 
     BEGIN 
      SET @Seconds = DATEDIFF(s, @LastTime, GETDATE()) 
      SET @Minutes = @Seconds/60 
      SET @Seconds = @Seconds - (@Minutes * 60) 
      PRINT 'Successfully applied ' + @name + ' in ' + cast(@Minutes as varchar) 
       + ' minutes ' + cast(@Seconds as varchar) + ' seconds.' 
      SET @LastTime = GETDATE() 
     END 
     ELSE 
     BEGIN 
      SET @errMessage = 'Error applying ' + @name + '! The database is in an unknown state and the schema may not match the version.' 
      SET @errMessage = @errMessage + char(13) + 'To find the error restore the database to version ' + @StartingVersion 
      SET @errMessage = @errMessage + ', set @UpToVersion = the last version successfully applied, then run ' + @name 
      SET @errMessage = @errMessage + ' manually in Query Analyzer.' 
     END 
     IF @name = (@UpToVersion + '.sql') 
      GOTO CleanUpCursor --Quit if the final script specified has been run. 
    END 
    FETCH ENDT FROM OSQL_cursor INTO @name 
END 
1

या सिर्फ एक चर में अपनी स्क्रिप्ट पढ़ सकते हैं और यह निष्पादित करने के लिए OPENROWSET का उपयोग करें:

DECLARE @SQL varchar(MAX) 
SELECT @SQL = BulkColumn 
FROM OPENROWSET 
    ( BULK 'MeinPfad\MeinSkript.sql' 
    , SINGLE_BLOB) AS MYTABLE 

--PRINT @sql 
EXEC (@sql) 
संबंधित मुद्दे