每日一SQL-在SQL中搜尋特定目錄下的所有檔案
每日一SQL系列好久沒寫了..哈哈。
最近發生好多不順遂的事,雖然有一部分是因為自己的優柔寡斷造成,
不過一連串的事情下來難免有些沮喪,也對未來多了些不確定性。
但我能做的,還是只有繼續用功,努力提升自己,對決定的事義無反顧,
這樣才對得起曾經栽培過或是幫助過我的人吧。
廢話太多,今天這個主題其實是在 每日一SQL-Cursor 這篇文章中有人回覆問的問題
秉持著有問必答的精神,雖然他的問題其實我也不太會,但還是靠同事的幫忙
跟google了一下,把這個問題的解法記錄下來。
基本上問題的重點在於能不能用SQL去達到像C#中的 DirectoryInfo下的GetFiles方法
去取得某個資料夾內的所有檔案。
我所想到的解決方法有下面三種:
- 撰寫抓檔名的程式並將dll註冊到SQL內呼叫。
- 先用程式將某資料夾內的檔案資訊先存到資料庫內以供使用。
- 利用 xp_cmdshell這個預存程序,也就是這篇的解法。
前兩個方式其實也不難,只是比較麻煩一點。那接下來開始講第三種作法:
在SQL中利用命令提示字元將得到的結果傳回
因此在SQL中下execute xp_cmdshell 'dir D:\ /b' 這樣的語法
可以將D槽下的檔案傳回。
(dir是顯示目錄或檔案,路徑是D:\,/b參數是使用單純格式,沒有標頭資訊或摘要)
但在使用時,可能會遇到下圖的錯誤訊息
這時只要把組態打開就可以使用了,請看下面語法
--將進階選項開啟
EXEC sp_configure 'show advanced options', 1;
GO
--更新
RECONFIGURE;
GO
--將xp_cmdshell開啟
EXEC sp_configure 'xp_cmdshell',1
GO
--更新
RECONFIGURE
GO
--以上動作只需要設定一次就行了
--執行xp_cmdshell
execute xp_cmdshell 'dir D:\ /b'
而使用上可以像這樣用
將資料塞入一個臨時的Table,之後再利用其他語法對這個Table做操作。
有時候回答別人問題,自己反而得到更多~所以如果有問題也歡迎發問。
我可以的話會盡力提供一些想法。
P.S 利用 xp_cmdshell可以將命令提示字元下指令的回傳結果當成資料,不過
因為我cmd也不強,所以舉不出什麼其他實用例子。但有需要的可以試試看這語法。
感謝 magic 與 hunterpo 的回覆。因此多補充一點。
由於功能太強大,會有其他安全性的風險,因此建議用完即關。
將sp_configure的參數改為0,如下
--將xp_cmdshell關閉
EXEC sp_configure 'xp_cmdshell',0
GO
--更新
RECONFIGURE
GO
這樣就會把功能關閉了。謝謝大家的回覆。