表記錄的插入方式有兩種。其一,先create table 再 insert into from ...。其二, 直接 select into。
第一種方式,由于要記錄日志,因此IO消耗更多,duration 更長(zhǎng)。一般來(lái)說(shuō)能用 select into 的,就盡量不要用 insert into的方式。
有時(shí),存儲(chǔ)過(guò)程中會(huì)需要,根據(jù)不同的條件,從不同的表中獲取數(shù)據(jù)放入一個(gè)臨時(shí)表。看起來(lái),這樣就需要在不同的分支語(yǔ)句中,寫多個(gè)對(duì)同一張的 select into 語(yǔ)句。
例如:
??? if (@b=1)
??? begin
???????? select? a.id, a.name, b.price
????????? into #temp
????????? from A inner join B on (a.id=b.id)
??? end else if (@b=2)
??? begin
?
???????? select? d.id, d.name, c.price
????????? into #temp
????????? from D inner join C on (d.id=c.id)
??? end?
但創(chuàng)建存儲(chǔ)過(guò)程時(shí)會(huì)報(bào)錯(cuò),說(shuō) #temp 表已經(jīng)存在。
怎么解決呢?
方法一:用第一種方式,問(wèn)題是性能差;
方法二:偷懶一些,但性能更好的方法
?
???????? select? a.id, a.name, b.price
????????? into #tempA
????????? from A inner join B on (@b=1 and a.id=b.id)
???????? where @b=1
?
?
?
???????? select? d.id, d.name, c.price
????????? into #tempB
????????? from D inner join C on (@b=2 and d.id=c.id)
????????? where @b=2
???????? select *
???????? into #temp
???????? from ( select * from #tempA union all select * from #tempB )
方法三:用動(dòng)態(tài)sql的辦法,把所有的語(yǔ)句都拼接好。好處是性能比方法二好,但缺點(diǎn)也很明顯,可讀性不強(qiáng);
方法四:其實(shí),不同的功能,還是最好分成不同的存儲(chǔ)過(guò)程,優(yōu)化,維護(hù)都更簡(jiǎn)單。
不知道有沒(méi)有更好的方式?
??
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
