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