gpt4 book ai didi

sql - sql server 2008 中的调度程序我是否以正确的方式执行或存在问题?

转载 作者:行者123 更新时间:2023-12-04 06:49:38 27 4
gpt4 key购买 nike

EDIT : Problem with the email I get mailbox unavailable exception! DBEmail.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml.Serialization;
using System.IO;
using System.Xml;
using System.Text;
using System.Net;
using System.Net.Mail;
using System.Xml.Linq;


public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure()]
public static void DBEmail(string Sender, string SendTo, string Subject, string Body, string mailServer)
{
System.Net.Mail.MailMessage m = new System.Net.Mail.MailMessage();
m.From = new System.Net.Mail.MailAddress(Sender);
m.To.Add(new System.Net.Mail.MailAddress(SendTo));
m.Subject = Subject;
m.Body = Body;
System.Net.Mail.SmtpClient client = null;
client = new System.Net.Mail.SmtpClient();
client.Host = mailServer;
client.UseDefaultCredentials = false;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Credentials = new System.Net.NetworkCredential("User@MySite.com", "password");
client.Send(m);
}
}

我必须每晚运行一些存储过程。所以我创建了一个 .sql 文件,它基本上 -
exec proc1
exec proc2...

那么,如果我像这样运行它们,或者它们需要包装在开始结束或其他东西中,那么是否可以... Fruther我有一个批处理文件,我将安排运行 -
sqlcmd -S myserver.myserver.com -i 
D:\Scripts\StartProcs.sql -U username -P password -o D:\Scripts\log.txt

这是上面的脚本正确吗?我的意思是它可以运行它测试运行它...但我只需要确保我在这里没有遗漏任何其他问题?因为我看到了一些其他的 sqlcmd 命令,这些命令非常长并且需要很多参数......我只是想确保我没有遗漏任何重要的参数..

请使用 .sql 文件或批处理文件更正我上面的...如果我没有考虑任何问题? ...谢谢

最佳答案

我看到的唯一问题是,使用这种技术(除非您在 procs 中内置了一些东西),如果出现问题,或者在这种情况下成功完成,您将不会自动收到通知。

在 SQL Server Express 中,您可以添加一个 CLR 函数,您可以使用该函数向您发送一封电子邮件,报告上述 sproc 的结果。

以下是使用所有免费工具的方法。

首先确保通过执行此操作启用 CLR 集成

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO

您还需要对程序集进行签名或将数据库标记为可信赖的。要标记 DB Trustworthy,请确保您以 SysAdmin 角色的成员身份登录 SQL Server 并执行此操作
ALTER DATABASE YourDBName SET TRUSTWORTHY ON;

接下来将以下内容保存为 C:\Code\DBEmail.cs
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure()]
public static void DBEmail(string Sender, string SendTo, string Subject, string Body, string mailServer)
{
System.Net.Mail.MailMessage m = new System.Net.Mail.MailMessage();
m.From = new System.Net.Mail.MailAddress(Sender);
m.To.Add(new System.Net.Mail.MailAddress(SendTo));
m.Subject = Subject;
m.Body = Body;

System.Net.Mail.SmtpClient client = null;
client = new System.Net.Mail.SmtpClient();
client.Host = mailServer;

client.Send(m);
}
}

然后在适当的 .Net Framework 目录中找到 C# 命令行编译器,在我的情况下它是“C:\Windows\Microsoft.NET\Framework\v2.0.50727”)cd 到它并执行它。
csc.exe /target:library /out:C:\Code\DBEmail.dll C:\Code\DBEmail.cs

然后将生成的 C:\Code\DBEmail.dll 复制到 SQL Server(如果您还没有在 SQL Server 上)并在 Management Studio 中执行它。
CREATE ASSEMBLY [DBEmail]
AUTHORIZATION [dbo]
From 'C:\Code\DBEmail.dll'
WITH PERMISSION_SET = External_Access

最后通过执行这个来创建一个 sproc 来映射到 CLR 代码
CREATE PROCEDURE [dbo].[usp_DBEmail]
@Sender [nvarchar](255),
@SendTo [nvarchar](255),
@Subject [nvarchar](255),
@Body [nvarchar](max),
@mailserver [nvarchar](55)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [DBEmail].[StoredProcedures].[DBEmail]

然后,您可以在 Try Catch 中将代码包装在预定的 sproc 中,如果发生错误,则在电子邮件中向自己发送错误消息,如下所示。
BEGIN TRY
--Your SQL Stuff
END TRY
BEGIN CATCH
Declare @error as nvarchar(max);
SELECT @error = ERROR_NUMBER();
Exec usp_DBEmail @Sender='sender@xyz.com', @SendTo='you@xyz.com', @subject='Whoops', @Body=@error, @mailserver='smtp_ip'
END CATCH;

希望这是有帮助的!

关于sql - sql server 2008 中的调度程序我是否以正确的方式执行或存在问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3310335/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com