TSQL更新表使用一个存储过程调用另一个存储过程

时间:2013-11-28 01:04:45

标签: sql-server tsql stored-procedures

我有以下存储过程,它返回每个输入完整文件路径字符串的文件大小。

我想编写另一个包装存储过程或函数来更新具有两列的表。列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 个答案:

答案 0 :(得分:1)

将存储过程重写为返回大小的标量used-defined函数。然后,您不需要第二个存储过程,单个更新语句将执行此操作:

UPDATE MyTable SET Size = fn_get_file_size(Full_Path)

(注意:您需要使用表变量而不是临时表#res,因为在UDF中不允许使用临时表)