0

我有简单的 sql 脚本:

Select * from student where score > 60

我想要做的是每 1 小时运行一次上述脚本,并以任何可能满足上述条件的方式在我的计算机上收到通知。所以基本上我不想进去,在上面的语句中每小时按 F5,看看我是否得到任何结果。我希望有人在这里有一些东西,如果你这样做,请分享代码。

4

1 回答 1

1

可以使用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服务更容易调试,因为你可以从命令行运行它。您还可以传递命令行参数,因此您不需要应用程序配置文件

于 2012-12-04T17:14:23.940 回答