我有以下存储过程,它返回每个输入完整文件路径字符串的文件大小。
我想编写另一个包装存储过程或函数来更新具有两列的表。列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
答案 0 :(得分:1)
将存储过程重写为返回大小的标量used-defined函数。然后,您不需要第二个存储过程,单个更新语句将执行此操作:
UPDATE MyTable SET Size = fn_get_file_size(Full_Path)
(注意:您需要使用表变量而不是临时表#res
,因为在UDF中不允许使用临时表)