在实例上的数据库集合上运行.sql文件

本文关键字:运行 sql 集合 文件 数据库 实例 | 更新日期: 2023-09-27 18:12:21

FileInfo file = new FileInfo("C:''LS''SmartStats.sql");
string script = file.OpenText().ReadToEnd();
SqlConnection conn = new SqlConnection(sqlConnectionString);
Server server = new Server(new ServerConnection(conn));
server.ConnectionContext.ExecuteNonQuery(script);

我不知道我从哪里偷了这个代码,但它在一个数据库上工作。

我是c#新手。

我想能够调用任何。sql文件从内部或外部的应用程序。我不能只是字符串。sql文件,并做一个foreach在任何给定的实例上的数据库集合?

在实例上的数据库集合上运行.sql文件

//引用下列SMO集合

Microsoft.SqlServer.Management.Sdk.Sfc

Microsoft.SqlServer.ConnectionInfo

Microsoft.SqlServer.Smo

//使用Microsoft.SqlServer.Management.Common;使用Microsoft.SqlServer.Management.Smo;

//

    public static void  ExecuteScript(string fname, List<string> databases)
    {
        string script = File.ReadAllText(fname);
        ServerConnection conn = new ServerConnection("server-name/instance", "user", "password");
        Server SMOServer = new Server(conn);
        // foreach (Database db in SMOServer.Databases) //for all databases in server
        foreach (var dbname in databases)
        {               
            var db = SMOServer.Databases[dbname];
            var ds = db.ExecuteWithResults(script); //if you want query result as a Dataset
          //db.ExecuteNonQuery(script); // if you run non return query result, e.g update/insert/delete
        }
        conn.Disconnect();
    }

我将假设您在某个地方有需要迭代的数据库列表,并且您可以计算出这一部分。

一旦你这样做了,使它工作的秘密是SQL USE语句。你只需要在脚本的顶部动态地添加它,一切都应该正常工作。

例如:

        FileInfo file = new FileInfo("C:''LS''SmartStats.sql");
        string script = file.OpenText().ReadToEnd();
        SqlConnection conn = new SqlConnection(sqlConnectionString);
        Server server = new Server(new ServerConnection(conn));
        var databaseNames = new List<String> {"database1", "database2"};
        foreach (var databaseName in databaseNames)
        {
            server.ConnectionContext.ExecuteNonQuery("USE " + databaseName + Environment.NewLine + "GO" + Environment.NewLine + script);
        }