2009-02-20 22 views
8

के माध्यम से एसक्यूएल फाइलों को एसक्यूएल संग्रहीत प्रक्रियाओं को कैसे सहेजते हैं, मैं अपने एमएस एसक्यूएल सर्वर 2005 संग्रहीत प्रक्रियाओं को स्वचालित रूप से .sql फ़ाइलों में सहेजना चाहता हूं (एक उपकरण पसंद करूंगा जिसे मैं .bat के माध्यम से कॉल कर सकता हूं) इसलिए मुझे क्लिक नहीं करना है प्रत्येक एकल sproc मैन्युअल रूप से और इसे बचाओ।बैच

मुझे पहले ही डेवियो आईटी से एसएमओस्क्रिप्ट मिला है, लेकिन यह सभी टेबल और स्पोक एकत्र करता है जिसमें कुछ समय लगता है। क्या कोई ऐसा उपकरण है जहां मैं परिभाषित कर सकता हूं कि कौन सा स्पोक निर्यात करना है? इसके अलावा मुझे यूएसई क्लॉज भी याद आ रहा है जो एसएमओएसक्रिप्ट क्रिएट के लिए स्क्रिप्ट स्पोक के रूप में मैनुअल निर्यात के विपरीत निर्यात की गई फाइल में नहीं जोड़ता है।

सादर शॉन

उत्तर

5

देखो स्क्रिप्ट के साथ बैच फ़ाइल बनाएँ (प्रारूपित करने के बारे में खेद है, लेकिन यह वास्तव में बैच निष्पादित करने के लिए इनलाइन होना चाहिए है):

osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -n -o "sp_list.txt" 
for /f %%a in (sp_list.txt) do osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_NAME = '%%a'" -n -o "%%a.sql" 

नाम यह "run.bat"। अब, बैच उपयोग पैरामीटर निष्पादित करने के लिए:
run.bat [उपयोगकर्ता नाम] [पासवर्ड] [servername] [डेटाबेस] उदाहरण पर
:
run.bat सा pwd111 स्थानीय होस्ट \ SQLEXPRESS मास्टर
पहले सभी संग्रहीत प्रक्रिया नाम हो जाएगा फ़ाइल sp_list.txt में संग्रहीत, फिर एक अलग स्क्रिप्ट फ़ाइलों में से एक। केवल मुद्दा - परिणाम गिनती के साथ प्रत्येक स्क्रिप्ट की अंतिम पंक्ति - मैं इस पर काम कर रहा हूँ ':)

संपादित: क्वेरी में बग को ठीक

निकाला जा रहा है लाइन
ठीक है "प्रभावित पंक्तियाँ", अब हमें एक और बैच बनाने की जरूरत है:

type %1 | findstr /V /i %2 > xxxtmpfile 
copy xxxtmpfile %1 /y /v 
del xxxtmpfile 

इसे "line_del.bat" नाम दें। देखें, पहला पैरा प्रोसेस करने के लिए फ़ाइल है, दूसरा - हटाने के लिए लाइनों को खोजने के लिए स्ट्रिंग।

osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -n -o "sp_list.txt" 
call line_del sp_list.txt "rows affected" 
call line_del sp_list.txt "row affected" 
for /f %%a in (sp_list.txt) do osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_NAME = '%%a'" -n -o "%%a.sql" 
for /f %%a in (sp_list.txt) do call line_del %%a.sql "rows affected" 
for /f %%a in (sp_list.txt) do call line_del %%a.sql "row affected" 

देखें संबंधित लेख:
Simple programming commands in a batch environment
osql Utility
MSSQL: How do you script Stored Procedure creation with code?
Delete certain lines in a txt file via a batch file

:) आप देख सकते हैं, पिछले दो से कर रहे हैं अब मुख्य बैच (फिर से, प्रारूपित करने के बारे में खेद है) को संशोधित इसलिए!

+0

बहुत बहुत धन्यवाद! मैंने थोड़ा सा प्रयास किया है, लेकिन प्रमाणीकरण के साथ कुछ समस्याएं हैं (osql cant connect)। मैं इसे अगले दिन कोशिश करूँगा ... सबसे अच्छा – seansilver

+1

क्या बड़ी प्रोसेस के लिए यह ब्रेक नहीं होगा? जब मैं चलाता हूं: ROUTINE_NAME, अधिकतम (लेन (ROUTINE_DEFINITION) चुनें, INFORMATION_SCHEMA.Routines ROUTINE_NAME द्वारा समूह 2 desc द्वारा क्रमबद्ध करें; मुझे बहुत सारी प्रोसेस मिलती हैं जो 4000 वर्ण हैं। सही डेटा प्राप्त करने के लिए आपको निश्चित रूप से sys.com से बाहर निकालना होगा। – jcollum

+0

ओह, यह ऊपर टिप्पणी में syscomments होना चाहिए। – jcollum

2

एसक्यूएल सर्वर प्रबंधन स्टूडियो में एक वैकल्पिक, डेटाबेस को स्क्रिप्ट नहीं है ...

डेटाबेस को खोजने के लिए ऑब्जेक्ट एक्सप्लोरर दृश्य को विस्तृत करें, सही क्लिक करें और "कार्य: उत्पन्न करें लिपियों "

वहां से आप सभी ऑब्जेक्ट्स, बस संग्रहीत वकालत, बीच में कुछ भी स्क्रिप्ट कर सकते हैं। एक पृष्ठ पर कुछ विकल्प हैं, हालांकि मुख्य रूप से मैं बदलता हूं: - "अगर मैं पूर्ववत नहीं करता हूं"

वह विकल्प "गलत" बनाकर आपको केवल कथन स्टेटमेंट की पूरी सूची मिलती है।

फिर आप वस्तुओं को एक नई क्वेरी विंडो या फ़ाइल में स्क्रिप्ट करने का विकल्प चुन सकते हैं।

+0

संकेत के लिए धन्यवाद, दुर्भाग्य से मैं यह मेरे के लिए कुछ नुकसान है - मैं सभी चरणों के माध्यम से हाथ (कोई ऑटो/बैच) द्वारा हर बार जाना है - सभी चयनित संग्रहित प्रक्रियाओं एक .sql में सहेजे जाते हैं फ़ाइल - कोई टिप्पणी नहीं सहेजी गई – seansilver

0

मैं थोड़ी देर पहले वही काम करना चाहता था और मैं इसे एक छोटी vbscript बनाकर कर रहा था।

यहाँ Source Control and stored procedures

0

मैंने उपयोगकर्ता के बजाय sqlcmd और -E का उपयोग किया है, पास करें। यह अब तक ठीक काम करता है, बस 4000 वर्ण से अधिक समय संग्रहित प्रक्रियाओं एक लाइन तोड़ने

sqlcmd -E -S SERVER -d DB -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt" 
call line_del sp_list.txt "rows affected" 
call line_del sp_list.txt "row affected" 
for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER -d DB -h-1 -Q "SELECT text from dbo.syscomments WHERE id = OBJECT_ID('%%a')" -o "%%a.sql" 
for /f %%a in (sp_list.txt) do call line_del %%a.sql "rows affected" 
for /f %%a in (sp_list.txt) do call line_del %%a.sql "row affected" 

सादर शॉन

0

मैं NOCOUNT पर सेट जोड़ा line_del.bat की आवश्यकता को समाप्त करना होगा। Sys.sql_modules (SQL 2005) के साथ syscomments भी बदल दिया। मैं OBJECT_DEFINITION फ़ंक्शन का भी उपयोग कर सकता था लेकिन यह sys.sql_modules से धीमा था।

sqlcmd -E -S SERVER -d DB -h-1 -Q "SET NOCOUNT ON SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt" for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER -d DB -h-1 -Q "SET NOCOUNT ON SELECT definition from sys.sql_modules WHERE object_id = OBJECT_ID('%%a')" -o "%%a.sql" 
+0

एक स्टैंडअलोन उत्तर नहीं, उस उत्तर पर एक टिप्पणी होनी चाहिए जिसके बारे में आप बात कर रहे हैं। – jcollum

1

वास्तव में line_del.bat की आवश्यकता को समाप्त किया सेट NOCOUNT पर जोड़ा जा रहा है, लेकिन sys.sql_modules साथ syscomments की जगह प्रत्येक संग्रहीत प्रक्रिया 258 वर्णों तक छोटा कर दिया जा रहा है के परिणामस्वरूप। अच्छे परिणाम के लिए तो कोड मैं का इस्तेमाल किया गया था:

sqlcmd -E -S SERVER-d DB -h-1 -Q "SET NOCOUNT ON SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt" 
for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER-d DB -h-1 -Q "SET NOCOUNT ON SELECT text from dbo.syscomments WHERE id = OBJECT_ID('%%a')" -o "%%a.sql" 

कौन सा काम किया, और line_del.bat के उपयोग की आवश्यकता नहीं थी।

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
प्रत्येक .sql की शुरुआत में

, और अनुगामी GO भी आदेश: मैं क्या नहीं मिला (कार्य/उत्पन्न स्क्रिप्ट/संग्रहित प्रक्रियाओं/सभी चुनें) जब मैं मैन्युअल निर्यात SSMS विज़ार्ड का उपयोग किया था । अविश्वसनीय रूप से महत्वपूर्ण नहीं है लेकिन कुछ ध्यान देने योग्य है। आपके योगदान के लिए मैक्स गोंटर, सेन्सिलवर और ली के लिए धन्यवाद! अब मैं डेटाबेस में संग्रहीत प्रक्रियाओं के बैकअप को स्वचालित कर सकता हूं, और संस्करण नियंत्रण लागू कर सकता हूं।

0

सहायता के लिए उपर्युक्त सभी को धन्यवाद और इसे अन्य sqlcmd noobs के लिए यहां छोड़ने के लिए यहां छोड़ दें। एसक्यूएल सर्वर 2005 पर काम करता है। ऑब्जेक्टनाम एक प्रक्रिया है, आदि नाम देखें।

:reset 

-- :setvar ObjectName "objectName" -- works 
:setvar ObjectName objectName -- works too 
declare @sql varchar(max); 
set @sql = 'select text from dbo.syscomments where id = object_id(upper("' + '$(ObjectName)' + '"))'; 
-- exec sp_helptext $(ObjectName) -- quick n easy but gets chopped to 256 width 
/* 4000 byte limit 
set @sql = 
    'select view_definition 
    from information_schema.views 
    where upper(table_name) = upper("' + '$(ObjectName)' + '")'; 
*/ 
:out $(ObjectName).sql 

exec(@sql) 
go 

:out stdout