請教下面的sql語法應有2筆卻出現三筆? |
尚未結案
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
以下sql語法小弟認為有邏輯上的錯誤結果,紅色部份只有兩筆但執行後
綠色部份出現三筆
而且當紅色部份是25筆時綠色部份則出現353筆
不知應如何下語法才正確
若是由直接下藍色部份則是25筆,但經由以下trigger則有353筆
是否藍色部份一直在被以某種方式trigger,如當insert into ins_tf_ml
一筆時就會trigger 藍色部份好幾筆
CREATE trigger [trigger_tf_ml_ins_del_upd] on [tf_ml]
after insert,delete,update
as
begin
declare @ins_count int,
@del_count int
if @@rowcount = 0 return
select @ins_count=count(*) from inserted
select @del_count=count(*) from deleted
if @ins_count>0 begin
insert into ins_tf_ml select * from inserted insert into mc_ti select '4A',convert(char(2),mf_ml.ml_id),convert(char(10),mf_ml.ml_no),convert(char(3),ins_tf_ml.itm),convert(char(8),ins_tf_ml.ml_dd),convert(char(20),ins_tf_ml.prd_no),
convert(char(8),(substring(convert(varchar(50),ins_tf_ml.qty),1,8))),'0',convert(char(10),mf_ml.dep),convert(char(15),ins_tf_ml.bat_no) from ins_tf_ml inner join mf_ml on ins_tf_ml.ml_no=mf_ml.ml_no
end
end
堅持從洗馬桶做起
Eric 發表人 - huangeider 於 2004/05/09 07:59:13 發表人 - huangeider 於 2004/05/09 08:00:26 發表人 - huangeider 於 2004/05/09 08:06:23
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
是一對多的情形,若把紅色部份改成如下情形是可以執行但是卻只有一筆
是否有辦法得到所有的結果集呢?如ins_tf_ml.itm=1..25的話
可否一次就正確選出來?
CREATE trigger [trigger_tf_ml_ins_del_upd] on [tf_ml]
after insert,delete,update
as
begin
declare @ins_count int,
@del_count int
if @@rowcount = 0 return
select @ins_count=count(*) from inserted
select @del_count=count(*) from deleted
if @ins_count>0 begin
insert into ins_tf_ml select * from inserted insert into mc_ti select '4A',convert(char(2),mf_ml.ml_id),convert(char(10),mf_ml.ml_no),convert(char(3),ins_tf_ml.itm),convert(char(8),ins_tf_ml.ml_dd),convert(char(20),ins_tf_ml.prd_no),
convert(char(8),(substring(convert(varchar(50),ins_tf_ml.qty),1,8))),'0',convert(char(10),mf_ml.dep),convert(char(15),ins_tf_ml.bat_no) from ins_tf_ml inner join mf_ml on ins_tf_ml.ml_no=mf_ml.ml_no and ins_tf_ml.itm=1 堅持從洗馬桶做起
Eric
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
mf_ml是ins_tf_ml的表頭,ins_tf_ml是mf_ml的表身,關聯性欄位是ml_no
itm是ins_tf_ml的項次別順序是由1開始每加一筆和ml_no相同編號的資料
itm就會加1,如ins_tf_ml的ml_no欄位編號有二筆是A00001時,第一筆itm是一
,第二筆itm是二
ml_dd(ins_tf_ml)(datetime)是日期,ml_id(mf_ml)(varchar)是特定值如領料以4表示,prd_no(ins_tf_ml)(varchar)是品名代號,qty(ins_tf_ml)(varchar)是數量(mf_ml)(varchar),dep(varchar)是部門名,bat_no(ins_tf_ml)(varchar)是批次號
insert into mc_ti select '4A',convert(char(2),mf_ml.ml_id),convert(char(10),mf_ml.ml_no),convert(char(3),ins_tf_ml.itm),convert(char(8),ins_tf_ml.ml_dd),convert(char(20),ins_tf_ml.prd_no),
convert(char(8),(substring(convert(varchar(50),ins_tf_ml.qty),1,8))),'0',convert(char(10),mf_ml.dep),convert(char(15),ins_tf_ml.bat_no) from ins_tf_ml inner join mf_ml on ins_tf_ml.ml_no=mf_ml.ml_no 堅持從洗馬桶做起
Eric
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
huangeider 你好 回頭看了第一篇貼文,發現好像是以下紅色部份的問題:< >< >
< class="code">
CREATE trigger [trigger_tf_ml_ins_del_upd] on [tf_ml]
after insert,delete,update
as
begin
declare @ins_count int,
@del_count int
if @@rowcount = 0 return
select @ins_count=count(*) from inserted
select @del_count=count(*) from deleted
if @ins_count>0 begin
Delete From ins_tf_ml<----- 是否應清除原有內容?
insert into ins_tf_ml select * from inserted insert into mc_ti select '4A',convert(char(2),mf_ml.ml_id),convert(char(10),mf_ml.ml_no)
,convert(char(3),ins_tf_ml.itm),convert(char(8),ins_tf_ml.ml_dd),convert(char(20)
,ins_tf_ml.prd_no),convert(char(8),(substring(convert(varchar(50),ins_tf_ml.qty),1,8)))
,'0',convert(char(10),mf_ml.dep),convert(char(15),ins_tf_ml.bat_no)
from ins_tf_ml inner join mf_ml on ins_tf_ml.ml_no=mf_ml.ml_no
end
end
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
引言: huangeider 你好 回頭看了第一篇貼文,發現好像是以下紅色部份的問題:< >< > < class="code"> CREATE trigger [trigger_tf_ml_ins_del_upd] on [tf_ml] after insert,delete,update as begin declare @ins_count int, @del_count int if @@rowcount = 0 return select @ins_count=count(*) from inserted select @del_count=count(*) from deleted if @ins_count>0 begin Delete From ins_tf_ml<----- 是否應清除原有內容? 嗯,應先清除,但是在測試時我也都會用空的table去試,但結果還是 如下面一對多的情形,這些天來的研究這個一對多的情形小弟已可用sql variant 代入解決,但是很麻煩的是要判斷給予sql variant的時機,也試過把需要的資料先另存在另一個table,但是若是架構大的話就很麻煩,也是大工程,不知這一對多的過濾後insert into的方法有更簡便的sql語法能達成嗎?還是只能慢慢的一步一步拆解? insert into ins_tf_ml select * from inserted insert into mc_ti select '4A',convert(char(2),mf_ml.ml_id),convert(char(10),mf_ml.ml_no) ,convert(char(3),ins_tf_ml.itm),convert(char(8),ins_tf_ml.ml_dd),convert(char(20) ,ins_tf_ml.prd_no),convert(char(8),(substring(convert(varchar(50),ins_tf_ml.qty),1,8))) ,'0',convert(char(10),mf_ml.dep),convert(char(15),ins_tf_ml.bat_no) from ins_tf_ml inner join mf_ml on ins_tf_ml.ml_no=mf_ml.ml_no end end堅持從洗馬桶做起 Eric |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
ins_tf_ml 明細表 A0001 1
A0001 2
A0001 3
.....
A0001 25 mf_ml 主表
A0001 insert into mc_ti select '4A',convert(char(2),mf_ml.ml_id),convert(char(10),mf_ml.ml_no)
,convert(char(3),ins_tf_ml.itm),convert(char(8),ins_tf_ml.ml_dd),convert(char(20)
,ins_tf_ml.prd_no),convert(char(8),(substring(convert(varchar(50),ins_tf_ml.qty),1,8)))
,'0',convert(char(10),mf_ml.dep),convert(char(15),ins_tf_ml.bat_no)
from ins_tf_ml inner join mf_ml on ins_tf_ml.ml_no=mf_ml.ml_no
是會寫入25筆呀
除非
mf_ml 主表
A0001 ..........
A0001 ..........
有兩筆以上的重複資料
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
引言: 只有兩筆但執行後,綠色部份出現三筆(1 2=3) 若是由直接下藍色部份則是25筆,但經由以下trigger則有353筆 是否藍色部份一直在被以某種方式trigger,如當insert into ins_tf_ml 一筆時就會trigger 藍色部份好幾筆huangeider 你好 答案好像是你自己懷疑的狀況喔!每Insert一筆觸發一次,且是以遞迴的方式觸發,所以筆數是從1 2=3, 1 2 3 4.... 25=325滿接近353的,檢查看看程序內,還有什麼狀況會觸發相同的程序,或是繞了一圈又觸發這個程序呢? 發表人 - chance36 於 2004/05/10 22:10:08 |
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
小弟似乎明白了這個trigger道理
小弟這個trigger是由一應用程式異動而引發的
而這應用程式的異動方式和trigger的異動方式不同
經小弟測試這應用程就算是在update狀態下也都是以insert和delete
的方式去異動的,所以trigger的update就算在應用程式中看似update
的異動也無法作用,而疑問的是若應用程式中一起insert25筆,
在trigger中是一筆一筆新增即inserted的count是一然後增完一筆後再增一筆
而inserted永遠是一,也就是說要trigger25次,或者insert時是25筆而trigger中的inserted count也是25,而trigger一次就完成,不過測試的結果似乎是25,但是若是如此,以上的程式應不會被一直遞迴trigger?這個問題是小弟不清楚的,25個
insert trigger還是一次trigger 25次呢?對了當上面itm是25時應是325才對,
不好意思 堅持從洗馬桶做起
Eric 發表人 - huangeider 於 2004/05/10 22:35:43
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
引言: 若是在analyzer query中執行是25筆 在trigger中則是325筆(ps 353筆當時是個模糊值 當時認為這個值沒有什麼邏輯所以用印像值3**來表示) 大概執行過不下幾十次都是如此結果huangeider 你好 改成如下看看 CREATE trigger [trigger_tf_ml_ins_del_upd] on [tf_ml] after insert,delete,update as begin declare @ins_count int, @del_count int if @@rowcount = 0 return select @ins_count=count(*) from inserted select @del_count=count(*) from deleted if @ins_count>0 begin // insert into ins_tf_ml select * from inserted 這行不要 insert into mc_ti select '4A',convert(char(2),mf_ml.ml_id),convert(char(10),mf_ml.ml_no) ,convert(char(3),ins_tf_ml.itm),convert(char(8),ins_tf_ml.ml_dd),convert(char(20) ,ins_tf_ml.prd_no),convert(char(8),(substring(convert(varchar(50),ins_tf_ml.qty),1,8))) ,'0',convert(char(10),mf_ml.dep),convert(char(15),ins_tf_ml.bat_no) from inserted inner join mf_ml on inserted.ml_no=mf_ml.ml_no end end發表人 - chance36 於 2004/05/10 23:15:18 |
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
引言: 但小弟會使此異動trigger 下個條件 insert into tran_file select seq_id ml_id ml_no itm ml_dd prd_no qty trk_qty dep from mc_ti 這個應有25筆但卻出現325筆?huangeider 你好 前面insert into mc_ti select .... 只是為了要轉換型態,以方便這個Insert的動作嗎?也就說mc_ti只是個中繼表格?我想應該不至於吧!所以程式改成 CREATE trigger [trigger_tf_ml_ins_del_upd] on [tf_ml] after insert,delete,update as begin declare @ins_count int, @del_count int if @@rowcount = 0 return select @ins_count=count(*) from inserted select @del_count=count(*) from deleted if @ins_count>0 begin // insert into ins_tf_ml select * from inserted 這行不要 insert into mc_ti select '4A',convert(char(2),mf_ml.ml_id),convert(char(10),mf_ml.ml_no) ,convert(char(3),ins_tf_ml.itm),convert(char(8),ins_tf_ml.ml_dd),convert(char(20) ,ins_tf_ml.prd_no),convert(char(8),(substring(convert(varchar(50),ins_tf_ml.qty),1,8))) ,'0',convert(char(10),mf_ml.dep),convert(char(15),ins_tf_ml.bat_no) from inserted inner join mf_ml on inserted.ml_no=mf_ml.ml_no insert into tran_file select ...(自行對映欄位)... from inserted end end |
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |