[SQL]T-SQL+DBmail 實現找出多Table 格式錯誤的Email資料

能不用到這個就不要用...正確的格式定義應於使用者輸入時就該進行Regular Expression的檢驗

而非後面再下T-SQL去找錯誤的資料...這樣只會消耗Server的資源…不過前人留下來的資料還是…唉

這個作法非常非常非常亂來,也非常非常非常粗魯,要採用請三思而後行

2017/1/9 文中#ResultData應修正為 ##ResultData

`========================================================

我的做法是建立兩個 Temp Table,#SearchData & ##ResultData

分別存入兩個資訊

1.錯誤格式指標(Ex.常用Domain錯誤:Gmail → Gamil or Yahoo → Yhaoo, ".ocm","c.om",".te",".tq" 等等等等…)

2.依據第一個Table的資訊所找出來的資料(就是那些有錯的Email格式啦)

Declare @compCmd nvarchar(20)
Declare @myCursor cursor

Create Table #SearchData(Invalid_Email nvarchar(10))
Create Table ##ResultData(A nvarchar(20),B nvarchar(20))

然後再把可能的錯誤格式insert到#SearchData

insert into #SearchData values
('%@yhaoo%'),('%@yahooc.%'),('%@gamil%'),('%@gmailc.%'),('%.ocm%'),('%com.tq%'),('%com.te%'),('%com.rw%'),('%com.td%'),('%c.om.tw%'),('%comt.w%')

真的是亂搞,前面宣告的@compCmd和@myCursor現在派上用場了

透過@myCursor逐筆去查#SearchData,例如上方我存了11筆記錄,原則上這個迴圈就會進行11次…

每一次迴圈,就去檢查那一堆Table Union在一起後是否有資料,如果有就把那些資料丟到一開始所建立的 ##ResultData,直到迴圈結束

SET @MyCursor = CURSOR FAST_FORWARD FOR select Invalid_Email from #SearchData

OPEN @MyCursor 

	FETCH NEXT FROM @MyCursor INTO @compCmd while @@FETCH_STATUS = 0

		Begin

			if exists(		
				select A,B from TableA where Col1 like @compCmd union
				select A,B from TableB where Col2 like @compCmd union
				select A,B from TableC where Col3 like @compCmd union
				select A,B from TableD where Col4 like @compCmd union
				select A,B from TableE where Col5 like @compCmd union
				select A,B from TableF where Col6 like @compCmd
					)
			begin
				insert ##ResultData(A,B)
				select A,B from TableA where Col1 like @compCmd union
				select A,B from TableB where Col2 like @compCmd union
				select A,B from TableC where Col3 like @compCmd union
				select A,B from TableD where Col4 like @compCmd union
				select A,B from TableE where Col5 like @compCmd union
				select A,B from TableF where Col6 like @compCmd
				
			end

	FETCH NEXT FROM @MyCursor INTO @compCmd                                

		End

CLOSE @MyCursor

DEALLOCATE @MyCursor                                      

這樣後我們就得到那些各種錯誤格式/手殘/亂打的資料,DBMAIL終於在釋放指標後派上用場了

設定檔選好,寄件人選好,標題內文等等 再使用@Query去撈那些錯誤資料,並且建立附件寄給需要的人

if exists(Select * from ##ResultData)
begin
exec msdb.dbo.sp_send_dbmail
	@profile_name='AAA', 
	@recipients='123@123.com.tw', 
	@subject='Email格式報錯', 
	@body='Email格式報錯',
	@Query=select * from ##ResultData,
	@Attach_query_result_as_file=1,
	@Query_attachment_filename='Invalid_Email_Address',
	@Body_format=HTML 
end

最後再把用完的兩個TempTable Drop掉就結束了 

Drop table #SearchData
Drop table ##ResultData

可以的話再把這些T-SQL放進排程裡,這樣就可以達成每周/月的資料檢查

不過還是要根治問題,先把AP端的格式定義好,別讓User一直丟垃圾進SQL server比較有意義…

 

 

 

 

 

 

 

單純筆記,皆為非正規作法,旁門左道,胡搞瞎搞。