循环遍历临时表的所有行以设置另一个临时表中的值

时间:2015-08-03 22:45:29

标签: sql sql-server loops temp-tables

我有一个复杂的场景要处理。我有一组存储过程(每个搜索条件一个),根据我们在SQL SERVER中选择的搜索条件搜索记录。 例如,如果你采用一个存储过程,则通过取" firstname"返回一组列(记录)。作为基于名字搜索的输入参数。

例如,存储过程基于某些连接返回record_id,record_check_id,memberid,memberlname,memberfname,address1,address2,city1,State1,Zip1和Phone。 根据此条件,地址字段来自表Member_adress表,Member_adress.record_id = records.record_id。现在我必须从另一个地址获取这些地址字段 table member_additional_address如果record_check_id = 1。

为此,我尝试了这种方式。

我将所有符合成员名字字段的记录作为输入字段。

select a.record_id, a.record_check_id into #temp_table From   
 members b 
 inner loop join records a 
 on a.member_id = b.member_id
 Where b.fname like @firstname  

现在,我的要求是检查临时表(#temp_table)中这些记录的record_check_id,如果是1(一),  我们需要从member_additional_address表返回地址字段,而不是从member_address表中获取。  如果一条记录的@record_check_id = 1并且在@member_additional_address表中没有任何记录与该record_id,那么我们需要显示member_address本身的详细信息。

为此,我创建了一个包含这些地址字段的临时表,

declare @Addressinfo table 
(
address1 varchar(30),
address2 varchar(30),
city varchar(30),
state char(2),
zip char(5))

下一步:

While (Select Count(*) From #temp_table) > 0 
if (record_check_id = 1)
update t
set 
t.address1 = f.address1,
t.address2 = f.address2,
t.city = f.city,
t.state = f.state,
t.zip = f.zip,
t.zip_ext = f.zip_ext
from @Addressinfo t
join @member_additional_address f (nolock)
on t.record_id= f.record_id
where record_check_id = 1
.
.
.
.
.
//something like this

接下来希望通过将记录表与@addressinfo temp_table的记录相结合来返回所有需要的列。 请告诉我如何在这里实现逻辑。非常感谢提前!

1 个答案:

答案 0 :(得分:0)

通常在SQL中,您希望避免使用循环。您的第一个查询将归结为:

select 
    a.record_id, 
    a.record_check_id 
into #temp_table 
From   
    members b join records a 
    on a.member_id = b.member_id
Where b.fname like @firstname  

以基于集合的方式做同样的事情。

关于第二部分的快速说明,使用nolock通常不赞成,除非你对它的陷阱感到满意。如果您不确定它们是什么,请不要使用它。在像这样的临时表上使用它可能在任何情况下都不会给你带来任何好处。现在,说到这一点,我会这样做,而不使用临时表的中间步骤:

select 
    a.record_id, 
    a.record_check_id,
    isnull(f.address1,t.address1),
    isnull(f.address2,t.address2),
    isnull(f.city,t.city),
    --etc--
From members b 
    join records a 
        on a.member_id = b.member_id
    left join @member_additional_address f 
        on t.record_id= f.record_id and a.record_check_id = 1
    left join @Address_info t on a.id = t.id -- I would join on where that address information is coming from 
Where b.fname like @firstname     

我可能会有一些专栏和错误的方法,但我希望这会帮助您指明正确的方向!

相关问题