SQLSERVER可以有扩展组件,利用这个特点我们可以用高级语言写个邮件发送方法,然后将他注册成SQL可以访问的组件,在SQL语句中就可以调用这个方法来发送邮件了,简单又方便.
这里对发邮件类不做介绍,重点讲下如何注册成组件并在SQL里面调用.
假如我们用C#写好了一个DLL组件名字叫 ExtenStoreProc.dll ,里面有发邮件的方法.在DOTNET安装目录下有个导入工具叫REGASM.EXE,利用它我们把.NET开发的组件注册成系统组件。
REGASM的语法是:
Microsoft (R) .NET Framework Assembly Registration Utility 1.1.4322.573
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
語法: RegAsm AssemblyPath [選項]
選項:
/unregister 取消註冊型別
/tlb[:FileName] 將組件匯出至指定的型別程式庫並註冊
/regfile[:FileName] 產生一個使用指定名稱的登錄檔,而不要註冊型別。
這個選項不可以和 /u 或 /tlb 選項一起使用
/codebase 設定登錄中的程式碼基底
/registered 僅參考已登錄的型別程式庫
/nologo 不要讓 RegAsm 顯示產品資訊
/silent 無訊息模式。不要顯示執行成功的訊息
/verbose 顯示其他的相關資訊
/? 或 /help 顯示這個使用方式的訊息
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
語法: RegAsm AssemblyPath [選項]
選項:
/unregister 取消註冊型別
/tlb[:FileName] 將組件匯出至指定的型別程式庫並註冊
/regfile[:FileName] 產生一個使用指定名稱的登錄檔,而不要註冊型別。
這個選項不可以和 /u 或 /tlb 選項一起使用
/codebase 設定登錄中的程式碼基底
/registered 僅參考已登錄的型別程式庫
/nologo 不要讓 RegAsm 顯示產品資訊
/silent 無訊息模式。不要顯示執行成功的訊息
/verbose 顯示其他的相關資訊
/? 或 /help 顯示這個使用方式的訊息
我们只需要执行如下命令即可:
regasm /tlb:ExtenStoreProc.tlb ExtenStoreProc.dll /codebase
如果提示成功则表示已将此组件导入成系统组件,我们就可以在SQL里面访问这个组件了
如下一个存储过程显示了如何调用此组件
CREATE
PROCEDURE
ExtenStoreProcTest
AS
declare @object int
DECLARE @hr int
DECLARE @property varchar ( 255 )
DECLARE @return varchar ( 255 )
DECLARE @src varchar ( 255 ), @desc varchar ( 255 )
-- 初始化
EXEC @hr = sp_OACreate ' ExtenStoreProc.ExtenStoreProc ' , @object OUT -- namespace.classname
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object , @src OUT, @desc OUT
SELECT hr = convert ( varbinary ( 4 ), @hr ), Source = @src , Description = @desc
RETURN
END
-- 執行
declare @subject varchar ( 255 ), @content varchar ( 8000 ), @mailfrom varchar ( 255 ), @mailto varchar ( 255 ), @cmd varchar ( 8000 )
set @subject = ' Sql Mail Test '
set @content = ' This is sql Procedure Send Mail '
set @mailfrom = 'mailfrom @company.com '
set @mailto = 'mailto @company.com '
set @cmd = ' SendMail(" ' + @subject + ' "," ' + @content + ' "," ' + @mailfrom + ' "," ' + @mailto + ' ") ' --SendMail为组件里的方法
print @cmd
EXEC @hr = sp_OAMethod @object , @cmd , @return OUT -- method
-- EXEC @hr = sp_OAMethod @object, 'Main', @return OUT --method
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object , @src OUT, @desc OUT
SELECT hr = convert ( varbinary ( 4 ), @hr ), Source = @src , Description = @desc
RETURN
END
PRINT @return
-- 銷毀
EXEC @hr = sp_OADestroy @object
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object , @src OUT, @desc OUT
SELECT hr = convert ( varbinary ( 4 ), @hr ), Source = @src , Description = @desc
RETURN
END
GO
declare @object int
DECLARE @hr int
DECLARE @property varchar ( 255 )
DECLARE @return varchar ( 255 )
DECLARE @src varchar ( 255 ), @desc varchar ( 255 )
-- 初始化
EXEC @hr = sp_OACreate ' ExtenStoreProc.ExtenStoreProc ' , @object OUT -- namespace.classname
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object , @src OUT, @desc OUT
SELECT hr = convert ( varbinary ( 4 ), @hr ), Source = @src , Description = @desc
RETURN
END
-- 執行
declare @subject varchar ( 255 ), @content varchar ( 8000 ), @mailfrom varchar ( 255 ), @mailto varchar ( 255 ), @cmd varchar ( 8000 )
set @subject = ' Sql Mail Test '
set @content = ' This is sql Procedure Send Mail '
set @mailfrom = 'mailfrom @company.com '
set @mailto = 'mailto @company.com '
set @cmd = ' SendMail(" ' + @subject + ' "," ' + @content + ' "," ' + @mailfrom + ' "," ' + @mailto + ' ") ' --SendMail为组件里的方法
print @cmd
EXEC @hr = sp_OAMethod @object , @cmd , @return OUT -- method
-- EXEC @hr = sp_OAMethod @object, 'Main', @return OUT --method
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object , @src OUT, @desc OUT
SELECT hr = convert ( varbinary ( 4 ), @hr ), Source = @src , Description = @desc
RETURN
END
PRINT @return
-- 銷毀
EXEC @hr = sp_OADestroy @object
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object , @src OUT, @desc OUT
SELECT hr = convert ( varbinary ( 4 ), @hr ), Source = @src , Description = @desc
RETURN
END
GO
如上就是用SQL调用外部组件发送邮件的全部过程