2011-08-26 9 views
7

एसक्यूएल सर्वर 2008स्क्रिप्ट सभी sprocs और बनाएं

लक्ष्य: sprocs कि डीबी में पहले से ही कर रहे हैं बनाने के लिए स्क्रिप्ट जनरेट करने के लिए। प्रति फ़ाइल एक स्क्रिप्ट होना चाहिए।

मुझे पता है कि मैं बस डेटाबेस और 'कार्य> जेनरेट स्क्रिप्ट्स' पर राइट क्लिक कर सकता हूं, लेकिन यह टेम्पलेट में स्प्रोक स्क्रिप्ट नहीं करता है।

मुझे उसी टेम्पलेट में स्क्रिप्ट करने की आवश्यकता है जब आप ऑब्जेक्ट एक्सप्लोरर और 'स्क्रिप्ट संग्रहीत प्रक्रिया के रूप में> ड्रॉप और क्रिएट' से स्पोक पर राइट क्लिक करते हैं।

यह सच आप 'स्क्रिप्ट उत्पन्न> कार्यों' के माध्यम से इस का एक समान संस्करण प्राप्त है, लेकिन मुख्य अंतर यह है 'कार्य> जनरेट स्क्रिप्ट' विधि dbo.sp_executesql आदेश के माध्यम से स्क्रिप्ट बनाता है, क्योंकि आप घोंसला नहीं कर सकते हैं एक CREATE PROCEDURE एक IF के अंदर ब्लॉक

कार्य> जनरेट इस निर्माण करता है:

USE someDB 
GO 

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'somesproc') AND type in (N'P', N'PC')) 
DROP PROCEDURE someSproc 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'someSproc') AND type in (N'P', N'PC')) 
BEGIN 
EXEC dbo.sp_executesql @statement = N'-- ============================================= 
CREATE PROCEDURE 
AS 
BEGIN 

END 
' 
END 
GO 

लेकिन (के रूप में सही sproc क्लिक करने से पाया जाता है) मैं इस आवश्यकता होती है:

USE someDB 
GO 

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'someSproc') AND type in (N'P', N'PC')) 
DROP PROCEDURE someSproc 
GO 

USE someDB 
GO 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE someSproc 

AS 
BEGIN 
    SET NOCOUNT ON; 

END 

GO 

कोई विचार?

+4

इस के साथ हल किया जाएगा:

मैं संग्रहीत प्रक्रिया इस तरह टेबल के लिए स्क्रिप्ट उत्पन्न करने के लिए संशोधित बनाएं या बदलें - क्या आपने वोट दिया/टिप्पणी की है?:-) http://connect.microsoft.com/SQLServer/feedback/details/127219/create-or-replace –

+0

आपके वांछित आउटपुट के बारे में कुछ प्रश्न। क्या आपको प्रत्येक कथन के बीच 'कुछ डीबी' उपयोग करने की आवश्यकता है? मुझे लगता है कि अनुमति और निर्भरता आदेश, उस तरह की चीज़ों को अनदेखा करना ठीक है? –

+0

केवल एक 'कुछ डीबी उपयोग करें' की आवश्यकता है। और हाँ, उन दोनों को अनदेखा किया जा सकता है। –

उत्तर

5

आदेश बनाने के लिए

: - SSMS से स्क्रिप्ट ...

चरण 1 पटकथा संग्रहीत प्रक्रिया बनाने

IF EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_ScriptProcedure]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[usp_ScriptProcedure] GO CREATE PROCEDURE [dbo].[usp_ScriptProcedure] ( @ObjectID INT, @Name NVARCHAR(128), @SchemaID INT ) AS DECLARE @code VARCHAR(MAX), @newLine CHAR(2) SET @newLine = CHAR(13) + CHAR(10) SET @code = 'USE [' + DB_NAME() + ']' + @newLine + 'GO' + @newLine + @newLine + 'IF EXISTS (SELECT * FROM sys.objects WHERE object_id = ' + 'OBJECT_ID(N''[' + SCHEMA_NAME(@schemaID) + '].[' + @Name + ']'') ' + 'AND type IN (N''P'', N''PC''))' + @newLine + 'DROP PROCEDURE [' + SCHEMA_NAME(@schemaID) + '].[' + @name + ']' + @newLine + @newLine + 'SET ANSI_NULLS ON' + @newLine + 'GO' + @newLine + @newLine + 'SET QUOTED_IDENTIFIER ON' + @newLine + 'GO' + @newLine + @newLine + OBJECT_DEFINITION(@ObjectID) + @newLine + 'GO' + @newLine + @newLine + 'SET ANSI_NULLS OFF' + @newLine + 'GO' + @newLine + @newLine + 'SET QUOTED_IDENTIFIER OFF' + @newLine + 'GO' WHILE @code <> '' BEGIN PRINT LEFT(@code,8000) SET @code = SUBSTRING(@code, 8001, LEN(@code)) END GO 

चरण 2 - सक्षम xp_cmdshell

EXEC sp_configure 'show advanced options', 1 
GO 
RECONFIGURE 
GO 
EXEC sp_configure 'xp_cmdshell', 1 
GO 
RECONFIGURE 
GO 

चरण 3 - नीचे स्क्रिप्ट चलाने

DECLARE 
    @name sysname, 
    @objID int, 
    @schemaID int, 
    @cmd varchar(1000), 
    @folder varchar(128), 
    @server varchar(128) 

SET @server = 'MSSQL' 
SET @folder = 'C:\Scripts' 

DECLARE procs CURSOR FOR 
SELECT name, object_id, schema_id 
FROM sys.procedures 
WHERE is_ms_shipped = 0 
ORDER BY [name] 
OPEN procs 

FETCH NEXT FROM procs 
INTO @name, @objID, @schemaID 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    SET @cmd = 'sqlcmd -S .\' + @server + ' -d ' + DB_NAME() 
      + ' -Q "EXEC usp_ScriptProcedure ' 
      + CONVERT(VARCHAR(20), @objID) + ', N''' 
      + @name + ''', ' + CONVERT(VARCHAR(20), @schemaID) 
      + '" > ' + @folder + '\' + @name + '.sql' 

    EXEC xp_cmdshell @cmd 

    FETCH NEXT FROM procs 
    INTO @name, @objID, @schemaID 

END 

CLOSE procs 
DEALLOCATE procs 

संदर्भ (सर्वर का नाम और फ़ोल्डर गंतव्य सेट करने सुनिश्चित करें):

0

यह मेरे लिए काम किया:

DECLARE tabls CURSOR FOR 
SELECT name, object_id, schema_id 
FROM sys.Tables 
WHERE is_ms_shipped = 0 
ORDER BY [name] 
OPEN tabls 

FETCH NEXT FROM tabls 
INTO @name, @objID, @schemaID 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    SET @cmd = 'sqlcmd -S .\' + @server + ' -d ' + DB_NAME() 
      + ' -Q "EXEC usp_ScriptProcedure ' 
      + CONVERT(VARCHAR(20), @objID) + ', N''' 
      + @name + ''', ' + CONVERT(VARCHAR(20), @schemaID) 
      + '" > ' + @folder_Tbl + '\' + @name + '.sql' 

    EXEC xp_cmdshell @cmd 

    FETCH NEXT FROM tabls 
    INTO @name, @objID, @schemaID 

END 

CLOSE tabls 
DEALLOCATE tabls 
संबंधित मुद्दे