对sql server数据库执行脚本

时间:2012-01-25 19:27:47

标签: c# sql sql-server-2008 powershell batch-file

我在sql server 2008的.sql文件中有一个数据库脚本,我想对我的数据库执行该脚本。相反,这是一个手动练习,我想自动化它。我有3个选项,批处理文件,powershell或c#。我执行此操作的方式将受到我的下一个问题的影响 - 我想执行脚本但是如果脚本因任何原因无法执行,也要注意代码?这将是一组常规安装步骤的一部分,因此如果脚本无法正确执行,则希望安装停止。

7 个答案:

答案 0 :(得分:1)

将其作为SQL代理作业运行,您可以将SQL代理设置为在脚本失败时向您发送警报。

答案 1 :(得分:0)

您是否看过使用SQLCMD实用程序? http://msdn.microsoft.com/en-us/library/ms162773.aspx

答案 2 :(得分:0)

以下是通过c#

中的安装程序自动执行脚本的过程

c#中的代码

using (System.Data.SqlClient.SqlConnection con = new SqlConnection("YourConnection string")) {
    con.Open();
    SqlCommand cmd = new SqlCommand();
    string expression = "Parameter value";
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "Your Stored Procedure";
    cmd.Parameters.Add("Your Parameter Name", SqlDbType.VarChar).Value = expression;
    cmd.Connection = con;
    using (IDataReader dr = cmd.ExecuteReader()) {
        if (dr.Read()) {
        }
    }
}

在您的项目中添加一个安装程序类Reference => Installer class

You can find below mentioned events for the installer process.
1. Install
2. Commit
3. Rollback
4. UNInstall

在上面的事件中记下数据库连接和脚本执行代码。如果安装程序无法执行脚本异常,控制将自动转移到回滚事件。因此,最后回滚事件将告诉用户由于执行脚本失败而无法完成安装...

答案 3 :(得分:0)

您可以尝试SQL Server管理对象(SMO - http://msdn.microsoft.com/en-us/library/ms162169.aspx),这应该适用于您的场景,在安装过程中执行sql脚本。

在这个简短的代码中,您可以看到如何连接到SQL Server实例,这里使用了Windows身份验证,但您也可以通过提供connection.Login和connection.Password以及凭据来使用SQL身份验证。 在该事件之后设置处理程序,可以在( ServerMessage InfoMessage )和( StatementExecuted )脚本执行期间触发。同时使用 ServerMessage InfoMessage 是一种过度杀伤,因为 ServerMessage 也会显示信息性消息(SQL中的错误严重性<10),但它很好看它的运作方式。

在此示例中,textBox1.Text包含使用以下行执行的T-SQL脚本: server.ConnectionContext.ExecuteNonQuery(textBox1.Text); Execute语句被try ... catch包围,以捕获执行期间的任何错误。

private void button1_Click(object sender, EventArgs e)
    {
        ServerConnection connection = new ServerConnection("stjepan-lap");
        connection.LoginSecure = true;
        Server server = new Server(connection);
        server.ConnectionContext.InfoMessage += new SqlInfoMessageEventHandler(ConnectionContext_InfoMessage);
        server.ConnectionContext.StatementExecuted += new StatementEventHandler(ConnectionContext_StatementExecuted);
        server.ConnectionContext.ServerMessage += new ServerMessageEventHandler(ConnectionContext_ServerMessage);

        //Executes T-Sql script
        try
        {
            server.ConnectionContext.ExecuteNonQuery(textBox1.Text);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
            if (ex.InnerException != null)
                Debug.WriteLine(ex.InnerException.Message);
        }

        server.ConnectionContext.Disconnect();
    }

    void ConnectionContext_ServerMessage(object sender, ServerMessageEventArgs e)
    {
        Debug.WriteLine(e.Error);
    }

    void ConnectionContext_StatementExecuted(object sender, StatementEventArgs e)
    {
        Debug.WriteLine(e.SqlStatement);
    }

    void ConnectionContext_InfoMessage(object sender, SqlInfoMessageEventArgs e)
    {
        Debug.WriteLine(e.Message);
    }

您应该参考SMO dll并在代码文件中放置适当的用法

Microsoft.SqlServer.Smo.dll
Microsoft.SqlServer.ConnectionInfo.dll
Microsoft.SqlServer.Management.Sdk.Sfc.dll 
....
using System;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

答案 4 :(得分:0)

我认为批量更容易(但这是一种偏好)

runsqlscr.cmd

@echo off
REM :: building your script below, not needed if already created
REM echo Select * from PutTableHere where > %temp%\tmpsql.sql
REM echo "put rest of sql script here one line at a time" >> %temp%\tmpsql.sql
REM echo go >> %temp%\tmpsql.sql
REM echo.
REM echo script written
REM echo.
REM echo ready to execute script
REM :: delete pause if needed
REM pause
REM :: the actual command needed in script
REM sqlcmd -U thedbuser -P thepasswd -d thedbname -o resultsofscript.txt < %temp%\tmpsql.sql 
REM echo All done, displaying results
REM type resultofscript.txt
REM echo.

如果已经完成,可以跳过脚本的构建,只需更改%temp%tmpsql.sql即可  到脚本的位置和名称。

在sqlcmd行上

,您需要为“the *”

输入自己的值

以上是用于测试的,安装脚本所需的只是sqlcmd行。

快乐批处理

答案 5 :(得分:-1)

您也可以在存储过程中打包它,并使用一些错误处理。

答案 6 :(得分:-1)

  • 由sqlcmd.exe运行引导程序 - 更难处理错误
  • 由您自己的自定义应用程序运行 - 处理错误和提醒警报的最简单方法