我有简单的 sql 脚本:
Select * from student where score > 60
我想要做的是每 1 小时运行一次上述脚本,并以任何可能满足上述条件的方式在我的计算机上收到通知。所以基本上我不想进去,在上面的语句中每小时按 F5,看看我是否得到任何结果。我希望有人在这里有一些东西,如果你这样做,请分享代码。
可以使用Sql Agent创建作业,Sql server 2008也有邮件功能
打开 SQL Management Studio 并连接到您的 SQL Server
展开 SQL Server 代理节点(如果看不到,请使用 SQL 配置管理器或检查服务并确保SQL Server Agent (SQLINSTANCENAME)
已启动)
右键单击作业并选择“新作业”
您可以在作业中运行 SQL 语句。我会让你弄清楚那部分的其余部分(这很直观)
您可能希望使用xp_sendmail
查看 SQL 文档xp_sendmail
http://msdn.microsoft.com/en-us/library/ms189505(v=sql.105).aspx
您可能需要打开该功能(afaik 默认情况下它是关闭的)并且您需要一些服务器/机器来传递邮件(因此,如果在本地机器上,您可能需要安装 IIS 和 SMTP)
编辑:
假设您无法访问服务器并希望在客户端执行此操作,您可以创建一个 .NET 框架应用程序或 Windows 服务来使用计划或计时器方法为您完成工作:
时间表方法:
创建一个简单的命令行应用程序,它执行查询并通过邮件发送结果,并使用 Windows 调度程序每小时调用一次(或任何间隔时间)
定时器方法:
创建一个简单的应用程序或 Windows 服务,它将运行一个计时器线程,该线程每 x 分钟完成一次工作
我可能会选择前者。代码将非常简单 - 新的控制台应用程序:
static void Main(string args[])
{
// No arguments needed so just do the work
using(SqlConnection conn = new SqlConnection("ConnectionString"))
{
using(SqlCommand cmd = new SqlCommand("sql query text", conn))
{
var dr = cmd.ExecuteReader();
List<myClass> results = new List<myClass>();
// Read the rows
while(dr.Read())
{
var someValue = dr.GetString(dr.GetOrdinal("ColumnName"));
// etc
// stuff these values into myClass and add to the list
results.Add(new myClass(someValue));
}
}
}
if(results.Count > 0) // Send mail
{
//Send the message.
SmtpClient client = new SmtpClient(server);
// Add credentials if the SMTP server requires them.
client.Credentials = CredentialCache.DefaultNetworkCredentials;
MailMessage message = new MailMessage(
"recipient@test.com",
"sender@test.com",
"Subject",
"Body");
// Obviously you'd have to read the rows from your list, maybe override ToString() on
// myClass and call that using a StringBuilder to build the email body and append the rows
// This may throw exceptions - maybe some error handling (in any of this code) is advisable
client.Send(message);
}
}
免责声明:可能这些都不会编译:D
编辑2:我会这样做,因为它比Windows服务更容易调试,因为你可以从命令行运行它。您还可以传递命令行参数,因此您不需要应用程序配置文件