2013-10-09 30 views
0

我有一个存储过程,它根据3个参数生成一些xml:@property_id,@property_component_id和@return_as_xml。 @return_as_xml的值对于所有记录是0是相同的。存储过程循环

我已经修改了这个,现在需要根据特定条件(即活动和租用属性)为多个Property记录运行它。 property和property_component之间存在一对多关系,因此一个属性可以有多个property_components,并且至少有一个相应的记录。

我需要根据Property表中的活动和租用字段来选择我想要的记录。从property_component表中选择相应的property_component_id,其中存在相应的property_id。然后我想遍历每个结果行,执行存储过程为每行传入新参数。

我不想修改存储过程比我已经有更多,因为它是从一个asp.net控制台应用程序执行,它需要它返回单个属性的xml,即我不想改变存储过程为多个属性返回xml。

我的存储过程的执行只是标准生成的SQL Server代码:

DECLARE @return_value int 

EXEC @return_value = [dbo].[p_CPGUploader__FetchXMLForProperty_RCA] 
    @property_id = 106016, 
    @property_component_id = 108382, 
    @return_as_xml = 0 

SELECT 'Return Value' = @return_value 
GO 

我怎么能修改此为我描述的场景的工作,我怎么能得到通过它执行选择一个记录,然后循环存储过程基于选择的每一行的值传递?我来自asp.net背景,我的SQL Server技能非常有限,因此我们将不胜感激。我正在使用SQL Server 2008 R2,但我相信原始存储过程是在2004年编写的,如果这是相关的。

+0

是否可以将存储过程查询转换为函数?如果你从函数中创建XML,你可以从SELECT语句中调用它。你使用的是什么版本的SQL Server? – codingbadger

回答

0

如果您确实无法更改存储过程,则可以使用游标创建一个循环。

我不会建议这个行动的过程,除非绝对必要。

declare c cursor local read_only for 
select property_component_id from propertiestable 

declare @id 

open c 
fetch from c into @id 
while @@fetch_status=0 
begin 
    EXEC @return_value = [dbo].[p_CPGUploader__FetchXMLForProperty_RCA] 
      @property_id = 106016, 
      @property_component_id = @id, 
      @return_as_xml = 0 

    fetch next from c into @id 
end 
close c 
deallocate c