我目前正在维护一个超过17年的SQL Server数据库,并且其中包含大量未使用和过时的工件。
在过去几个月中,我们一直在分析数据库,以确定实际使用的1800多个存储过程中的哪一个,以及我们可以安全删除哪些存储过程。截至目前,我们有一份大约1300个清单,我们计划将其删除。
此数据库也在SQL Server数据库项目的源代码管理下签入。
现在,我想要做的是生成一个脚本来删除1300个过程,并在将脚本应用到我们的开发环境之前首先将该脚本应用于数据库项目。但我似乎无法通过脚本找到更新项目的方法。
我尝试过Import
> Script
并使用.sql
命令导入DROP PROCEDURE
文件,但是如果不从项目中删除该过程,则会引发以下错误:
在您为导入操作提供的脚本中,未完全理解一个或多个语句。这些语句被移动到ScriptsIgnoredOnImport.sql文件。查看文件内容以获取更多信息。
测试文件的内容如下:
Drop Procedure spProcedureName;
我可以完成项目并逐个删除每个程序......但有超过1300个删除......
有没有办法对数据库项目进行批量更新(通过脚本或其他方式)来删除多个数据库对象?
其他信息:
OPENROWSET
连接和其他过程的过时/无效引用。因此,部署脚本失败,如果不修改脚本中的各个无效对象,则无法创建shell数据库。由于上述限制,我只是在寻找一种可以直接应用于数据库项目而不依赖于辅助物理数据库的解决方案。
答案 0 :(得分:1)
更新:
替代方式:
答案 1 :(得分:0)
要以编程方式从项目中删除对象,可以使用EnvDTE.ProjectItem类,Remove()方法。
https://msdn.microsoft.com/en-us/library/envdte.projectitem.remove.aspx
有许多VS扩展可以运行EnvDTE命令,例如:https://vlasovstudio.com/visual-commander/index.html
或者您可以使用包管理控制台(工具 - > NuGet包管理器 - >包管理控制台)
步骤1。将SP列表分配给变量:
$ IncludeList =" SP1.sql"," SP2.sql"
第二步。如果项目位于列表中,则从项目中删除SP。
如果您的SP项目路径类似于" Database2 \ dbo \ Stored Procedures \",那么它就像:
$ DTE.Solution.Projects | ForEach {if($ .Name -eq" Database2"){$ .ProjectItems | ForEach {if($ .Name -eq" dbo"){$ .ProjectItems | ForEach {if($ .Name -eq" Stored Procedures"){$ .ProjectItems | ForEach {if($ IncludeList -contains $ .Name){$ .Remove()}}}}}}}}