我有一个要求,在生成build时,我需要为过程,函数和视图创建单独的脚本文件。我们遵循的方法是删除所有对象,然后再次重新创建它们。每次我们发布构建时都会发生这种情况。现在,我需要构建一个项目并提取SQL文件以首先删除对象,然后创建脚本来创建对象。
还要注意,是否修改了特定对象,仍然需要将其包含在脚本中。
感谢您是否共享方法以及实现该方法的细节。
答案 0 :(得分:0)
不是完全使用Visual Studio,但是Management Studio可以轻松地为您提供帮助。从您的项目中更新数据库的dev副本,并使用SSMS连接到它。然后使用Generate Scripts向导(右键单击数据库,单击任务->生成脚本...)为您的视图,过程和功能生成脚本:
在下一页的“高级”中,确保将Check for object existance
设置为True
,将Script DROP and CREATE
设置为Script DROP and CREATE
,并且Script for Server Version
对应于SQL Server的版本(因为它可能不支持DROP IF EXISTS
)。这将为您生成一个脚本,以删除并创建您在开始时选择的对象。您可以根据需要微调列表,例如排除一些物体。
答案 1 :(得分:0)
以下C#在生成CREATE和DROP脚本时使用SMO
对象。您会注意到,DROP语句在代码内完成,而CREATE DDL通过SMO
进行。此示例使用表,但是通过将Table
类(在foreach
循环中)更改为需要编写脚本的对象类型,可以对视图,存储过程,函数等执行相同的操作。如果您决定采用这种方法,则需要添加对Microsoft.SqlServer.ConnectionInfo
,System.Collections.Specialized
,Microsoft.SqlServer.Management.Sdk.Sfc
和Microsoft.SqlServer.Smo
的引用。如有必要,可以将DROP / CREATE语句用作SqlCommand
对象的文本,以进一步实现此过程的自动化。
//set server and database
Server srv = new Server(@"YourServer");
//to use Windows Authentication
srv.ConnectionContext.LoginSecure = true;
Database db = srv.Databases["YourDatabase"];
Scripter script = new Scripter(srv);
ScriptingOptions scriptOpt = new ScriptingOptions();
string dropFilePath = @"C:\Test\DROP_SCRIPT_";
string createFilePath = @"C:\CREATE_SCRIPT_";
string dropObjPt1 = "IF (OBJECT_ID(N'YourDatabase.YourSchema.";
string dropObjPt2 = "') IS NOT NULL) DROP TABLE ";
//this can changed to views, functions, stored procedures, etc.
foreach (Table t in db.Tables)
{
//check for system objects
//use t.Name to filter table name if needed
if (!t.IsSystemObject)
{
File.WriteAllText(dropFilePath + t.Name + ".sql", dropObjPt1 + t.Name + dropObjPt2 + t.Name);
}
}
foreach (Table t in db.Tables)
{
if (!t.IsSystemObject)
{
StringCollection sc = t.Script(scriptOpt);
foreach (string s in sc)
{
File.WriteAllText(createFilePath + t.Name + ".sql", s);
}
}
}