2011-08-26 5 views
7

SQL Server 2008のスクリプトすべてのストアドプロシージャをして

目標CREATE: DBに既に存在するストアドプロシージャを作成するためのスクリプトを生成するには。ファイルごとに1つのスクリプトでなければなりません。

私は単にデータベースと 'タスク>スクリプトを生成'を右クリックすることができますが、それは私が望むテンプレートのsprocをスクリプトしないことがわかります。

オブジェクトエクスプローラから「sproc」を右クリックし、「スクリプトストアドプロシージャ> DROPおよびCREATE」をクリックすると、同じテンプレートでスクリプトを作成する必要があります。

それはあなたが「スクリプトの生成>タスク」を介して、この同様のバージョンを取得本当だが、主な違いは「タスク]> [スクリプトの生成」メソッドを使用すると、IFの内部に巣CREATE PROCEDUREことができないためdbo.sp_executesqlコマンドを使用してスクリプトを作成します生成>

タスクをブロックすることは、この生成します。

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

これはで解決されるだろうCREATE OR REPLACE - 投票/コメントしましたか?:-) http://connect.microsoft.com/SQLServer/feedback/details/127219/create-or-replace –

+0

希望の出力に関するいくつかの質問。各ステートメントの間に 'someDB 'を使用する必要がありますか?私はアクセス許可と依存関係の順序を無視しても問題ないと思いますか? –

+0

ただ一つの 'USE someDB'が必要です。そして、はい、その2つは無視することができます。 –

答えて

5

など、エラー処理、適切なGCを残してきました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 
関連する問題