![](/img/trans.png)
[英]SQL Server - loop through temp table and calculate multiple values to insert rows into second table
[英]Loop through all the rows of temp table to set values in another temp table
我有一些復雜的情況需要處理。 我有一組存儲過程(每個搜索條件一個)可以根據我們在SQL SERVER中選擇的搜索條件來搜索記錄。 例如,如果采用一個存儲過程,則它以“名字”作為輸入參數返回一組列(記錄),以根據名字搜索。
例如,存儲過程將基於某些聯接返回record_id,record_check_id,memberid,memberlname,memberfname,address1,address2,city1,State1,Zip1和Phone。 在這種情況下,地址字段來自表Member_adress表,Member_adress.record_id = records.record_id。 現在,如果record_check_id = 1,我必須從另一個表member_additional_address獲取那些地址字段。
為此,我嘗試了這種方式。
我將滿足成員名字段的所有記錄作為我們的輸入字段。
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的記錄連接起來,以返回所有所需的列。 請讓我知道如何在這里實現邏輯。 在此先多謝!
通常,在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
我可能有一些專欄文章,但沒有寫錯的地方,但我希望這會為您指明正確的方向!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.