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)
有任何想法吗?
为了从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)
参考文献: