2013-11-28 64 views
1

我有以下存儲過程,它以每個輸入完整文件路徑字符串的字節爲單位返回文件大小。使用調用一個存儲過程調用另一個TSQL更新表

我想編寫另一個包裝存儲過程或函數來更新一個有兩列的表。 Full_Path列(下面的存儲過程的輸入)和列大小(應由下面的過程的輸出更新)。基本上我想使用下面的過程更新每個文件的大小列(在完整路徑列中指定)。

我不知道該怎麼做。請指教。

Create proc sp_get_file_size (@fileName varchar(200)) 
as 

begin 
declare @ntcmd varchar(200) 
declare @detailLine varchar(200) 
declare @pos1 int 
declare @pos2 int 
declare @size int 

set nocount on 

Create table #res (line varchar(400)) 
set @ntcmd = 'dir /-C ' + @fileName 
insert #res exec xp_CmdShell @ntcmd 
select @detailLine = line 
    from #res where rtrim(ltrim(line)) like '%bytes' 

-- if detail Line is null - return -1 
if isnull (@detailLine ,'*') = '*' return -1 

-- get position of words bytes and File(s) 
set @pos1 = charindex ('bytes' ,lower(@detailLine)) 
set @pos2 = charindex ('(s)' , lower(@detailLine)) 

-- extract the size value from the details Line 
set @size = convert (int, rtrim(ltrim( 
         substring (@detailLine , @pos2+3,@pos1 - @pos2 - 4)))) 
return (@size) 
set nocount off 
end 
go 
+1

注意:你不應該**爲存儲過程使用'sp_'前綴。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! –

回答

1

將您的存儲過程重寫爲標量用過的函數,該函數返回大小。然後,你不需要第二個存儲過程,一個更新語句將這樣的伎倆:

UPDATE MyTable SET Size = fn_get_file_size(Full_Path) 

(注:你需要,因爲臨時表使用表變量來代替臨時表#res不準裏面的UDFs)

+0

不錯的答案Vash! – user2705620

+0

注意SP中的exec xp_CmdShell @ntcmd。我不能用我認爲的函數來調用它。我得到的錯誤是我無法在函數中使用insert exec。任何解決方法? – user2965499

+0

我相信擴展存儲過程可以從UDF調用,從來沒有嘗試過,但它應該是可能的。如果不是 - 你將不得不求助於通過表循環(CURSOR哦),並單獨運行每個記錄的SP。或者通過多次調用SP來構建一個動態SQL,並一次執行它 –

相關問題