我有一个看似简单的要求。我需要按照这个标准编写数据库中的所有存储过程。
如果 proc 存在,则脚本需要包括删除,如下所示...
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[myproc]') AND type in (N'P', N'PC'))
该脚本不能有 sp_executesql 所以没有这样的......
EXEC dbo.sp_executesql @statement = '....'
我需要为每个存储过程创建一个单独的脚本文件。所以它将是 [存储过程名称].sql
我注意到当我尝试内置的 sql 生成脚本时,我可以通过用于在单独文件中编写对象的复选框将 procs 放在一个单独的文件中,并且我还可以获得 if exists 删除。但是,它使用了他们不想要的 sp_executesql。
所以我花了一些时间尝试 SMO 并发现了类似的问题......
A. 遗憾的是,以下仅编写 drop 语句的脚本。我看不到将它与创建结合起来。所以我可以获得单独的文件并且没有 sp_executesql 但我仍然缺少上面的#1
Scripter scripter = new Scripter();
scripter.Options.ScriptDrops = true;
B. 其次,以下选项将输出更改为使用 sp_executesql
scripter.Options.IncludeIfNotExists = true;
C. 最后,我可以手动添加文本。它已成功设置在 TextHeader 中。但是,scripter.Script() 抛出异常“{”StoredProcedure 'dbo.myproc' 的脚本失败。"}
storedProcedure.TextHeader = string.Format("IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'{0}') AND type in (N'P', N'PC')) \r\nDROP PROCEDURE {0} \r\nGO\r\n{1}", storedProcedure.Name, storedProcedure.TextHeader);
scripter.Options.FileName = Path.Combine(storedProceduresPath, storedProcedure.Name + ".sql");
scripter.Script(new Urn[] { storedProcedure.Urn }); //Exception! - Script failed for StoredProcedure
我无法想象这是一件多么奇怪的事情,所以我想知道人们是如何做到这一点的???如果需要使用 sql - 任务 - 生成脚本创建单独的文件,然后使用应用程序清除不需要的“EXEC dbo.sp_executesql @statement = N'”,这很遗憾