能不用到這個就不要用...正確的格式定義應於使用者輸入時就該進行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比較有意義…
單純筆記,皆為非正規作法,旁門左道,胡搞瞎搞。