使用Visual Studio 2013从数据库项目创建脚本

时间:2018-11-30 11:11:03

标签: sql-server visual-studio-2013

我有一个要求,在生成build时,我需要为过程,函数和视图创建单独的脚本文件。我们遵循的方法是删除所有对象,然后再次重新创建它们。每次我们发布构建时都会发生这种情况。现在,我需要构建一个项目并提取SQL文件以首先删除对象,然后创建脚本来创建对象。

还要注意,是否修改了特定对象,仍然需要将其包含在脚本中。

感谢您是否共享方法以及实现该方法的细节。

2 个答案:

答案 0 :(得分:0)

不是完全使用Visual Studio,但是Management Studio可以轻松地为您提供帮助。从您的项目中更新数据库的dev副本,并使用SSMS连接到它。然后使用Generate Scripts向导(右键单击数据库,单击任务->生成脚本...)为您的视图,过程和功能生成脚本:

enter image description here

在下一页的“高级”中,确保将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.ConnectionInfoSystem.Collections.SpecializedMicrosoft.SqlServer.Management.Sdk.SfcMicrosoft.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);
                        }
                    }
                }