台灣最大程式設計社群網站
線上人數
2198
 
會員總數:245253
討論主題:189111
歡迎您免費加入會員
討論區列表 >> MS SQL >> 不確定類別次數INSERT TABLE
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
不確定類別次數INSERT TABLE
價值 : 50 QP  點閱數:697 回應數:11

樓主

Authur Kuo
門外漢
0 4
64 6
發送站內信

不好意思,有一個問題提問,目前我在寫一隻store procedure,目的是去偵測某狀態下,input day 與現在日期的差距(30,60,90天),但是當中某個欄位是 Customer,但是在幾萬筆的資料裡面,我不知道Customer有幾家,但是每一家都需要INSERT(30,60,90天各一筆資料),請問我該如何下手?

以下是未加上 Customer的狀態



請問該如何改寫比較好???

搜尋相關Tags的文章: [ INSERT ] , [ MS SQL ] ,
本篇文章發表於2016-06-30 11:56
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
用cursor,大約會長這樣。

本篇文章回覆於2016-06-30 12:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

Authur Kuo
檢舉此回應
很抱歉,關於Daimom的寫法我不是很懂,我如果要處理Customer的數量的話,需要用到DISTINCT嗎? 該在哪裡先撈取? 抱歉,有點混亂,如果可以希望解釋簡單一些,不好意思@@..
本篇文章回覆於2016-06-30 13:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

pilipala
檢舉此回應
利用 CROSS JOIN 可以找出每個客戶和日期差異的全部組合


使用交叉聯結
https://technet.microsoft.com/zh-tw/library/ms190690(v=sql.105).aspx
本篇文章回覆於2016-06-30 13:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
cursor是指標,有點像是迴圈逐行跑。
步驟是這樣的
1.可以先利用樓上大大的方法擷取出你的customerName成一個表A
2.用while 針對表A一行一行的將customerName取出來後做處理
3.可以將處理完的值塞入一個temptable或其他..
4.結束
本篇文章回覆於2016-06-30 13:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
抱歉,我記錯cross join的用法了..
我不清楚 pilipala 大大 的作法是不是你要的。

-----修正#4
1.用distinct撈出你customerName的唯一值成一個表A
本篇文章回覆於2016-06-30 13:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

pilipala
檢舉此回應

SELECT @count=Count(*) FROM RMA_AGED_DAYS WHERE [Month] = @month and [Year] = @year and [Type] = '90'
if @count > 0 begin
select @id = Max(Id) FROM RMA_AGED_DAYS where [Type] = '90'
UPDATE RMA_AGED_DAYS SET Qty = @90count, Udt = @nowtime WHERE Id = @id
end
else begin
INSERT RMA_AGED_DAYS ([Year], [Month], [Type], Qty, Udt) VALUES (@year, @month, '90', @90count, @nowtime)
end


利用 EXISTS 來判斷資料是否存在,



或是改用 Merge 語法來完成這類需求,對於效能是有所幫助的

使用 MERGE 插入、更新,和刪除資料
https://technet.microsoft.com/zh-tw/library/bb522522(v=sql.105).aspx
本篇文章回覆於2016-06-30 14:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

Authur Kuo
檢舉此回應
不好意思,針對pilipala大 的方式有些疑問,我目前是用一個#temp 撈出需要處理的CustomerName, 接下來按照Daimom大 得作法我該怎麼做??

本篇文章回覆於2016-06-30 14:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
最有價值解答

Daimom
捐贈 VP 給 Daimom 檢舉此回應
給樓主一個範例,先將他丟去sql server management裡面跑跑看。
這是將本來的值多加100後 在存去新的table

本篇文章回覆於2016-06-30 16:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

Authur Kuo
檢舉此回應
感謝Daimom 大的範例,獲益良多,只是有一個疑問就是使用cursor的優勢是甚麼? 因為我發現在Store Procedure裡跑 While迴圈也可以跑出資料,是在效能上面有所差別嗎?? 還是說某些狀況下使用cursor會比較好??
本篇文章回覆於2016-07-01 13:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
cursor 可以看 這篇
cursor 講白話點就是 『目前指到的單筆資料』
本篇文章回覆於2016-07-01 15:00
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

pilipala
檢舉此回應
[SQL SERVER][Performance]盡量避免使用Cursor
https://dotblogs.com.tw/ricochen/archive/2010/11/09/19323.aspx

[SQL SERVER]優化Cursor
https://dotblogs.com.tw/ricochen/archive/2015/09/22/153413.aspx
本篇文章回覆於2016-07-01 21:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.