每日一SQL-在SQL中搜尋特定目錄下的所有檔案

每日一SQL-在SQL中搜尋特定目錄下的所有檔案

每日一SQL系列好久沒寫了..哈哈。

最近發生好多不順遂的事,雖然有一部分是因為自己的優柔寡斷造成,

不過一連串的事情下來難免有些沮喪,也對未來多了些不確定性。

但我能做的,還是只有繼續用功,努力提升自己,對決定的事義無反顧,

這樣才對得起曾經栽培過或是幫助過我的人吧。

 

廢話太多,今天這個主題其實是在 每日一SQL-Cursor 這篇文章中有人回覆問的問題

秉持著有問必答的精神,雖然他的問題其實我也不太會,但還是靠同事的幫忙

跟google了一下,把這個問題的解法記錄下來。

 

基本上問題的重點在於能不能用SQL去達到像C#中的 DirectoryInfo下的GetFiles方法

去取得某個資料夾內的所有檔案。

我所想到的解決方法有下面三種:

  1. 撰寫抓檔名的程式並將dll註冊到SQL內呼叫。
  2. 先用程式將某資料夾內的檔案資訊先存到資料庫內以供使用。
  3. 利用 xp_cmdshell這個預存程序,也就是這篇的解法。

前兩個方式其實也不難,只是比較麻煩一點。那接下來開始講第三種作法:

xp_cmdshell (Transact-SQL)

在SQL中利用命令提示字元將得到的結果傳回

因此在SQL中下execute xp_cmdshell 'dir D:\ /b' 這樣的語法

可以將D槽下的檔案傳回。

(dir是顯示目錄或檔案,路徑是D:\,/b參數是使用單純格式,沒有標頭資訊或摘要)

但在使用時,可能會遇到下圖的錯誤訊息

2011-04-16_012502

這時只要把組態打開就可以使用了,請看下面語法

--將進階選項開啟
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'

而使用上可以像這樣用

image

將資料塞入一個臨時的Table,之後再利用其他語法對這個Table做操作。

 

有時候回答別人問題,自己反而得到更多~所以如果有問題也歡迎發問。

我可以的話會盡力提供一些想法。

 

P.S 利用 xp_cmdshell可以將命令提示字元下指令的回傳結果當成資料,不過

      因為我cmd也不強,所以舉不出什麼其他實用例子。但有需要的可以試試看這語法。

 

感謝 magic 與 hunterpo 的回覆。因此多補充一點。

由於功能太強大,會有其他安全性的風險,因此建議用完即關

將sp_configure的參數改為0,如下

--將xp_cmdshell關閉
EXEC sp_configure 'xp_cmdshell',0
GO
--更新
RECONFIGURE
GO

這樣就會把功能關閉了。謝謝大家的回覆。