使用DROP和CREATE一次编写所有Sprocs脚本

Jus*_*elf 7 t-sql sql-server sql-server-2008

SQL Server 2008

目标:生成用于创建已在DB中的sprocs的脚本.每个文件必须是一个脚本.

我知道我可以直接右键单击数据库和"任务>生成脚本",但这不会编写我想要的模板中的sproc脚本.

我需要在您从对象资源管理器中右键单击sproc并将"脚本存储过程为> DROP和CREATE"时获得的相同模板中编写脚本.

这是通过'Tasks> Generate Scripts'得到类似版本的,但主要区别是'Tasks> Generate Scripts'方法通过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
Run Code Online (Sandbox Code Playgroud)

但是我需要这个(从右键单击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
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

8kb*_*8kb 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
Run Code Online (Sandbox Code Playgroud)

第2步 - 启用xp_cmdshell

EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
Run Code Online (Sandbox Code Playgroud)

第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
Run Code Online (Sandbox Code Playgroud)

参考文献: