iT邦幫忙

0

SQL 比對兩個欄位資料然後UPDATE的問題 _已解決

  • 分享至 

  • xImage

各位大大好,小弟是SQL新手想請教各位前輩還請前輩不另指教
Table A 有三個欄位 [Creat_Time],[Update_Time],[InFo]
當[Creat_Time]不等於[Update_Time]的時候
就UPDATE [InFo] (TRUE OR FALSE)
同時也將[Update_Time]資料UPDATE 到[Creat_Time]
想請問語法該怎麼實現??

看更多先前的討論...收起先前的討論...
Albert iT邦高手 1 級 ‧ 2018-04-04 06:24:24 檢舉
你真是在搞亂系統
Updated 怎會跟 Created 一樣除非是剛建立
怎會有人將 Updated =/= Created
要去Update 欄位 Updated = Created
-----------------------------------------------
小火車 iT邦新手 4 級 ‧ 2018-04-04 09:02:28 檢舉
謝謝大大的指正,小弟虛心求教
我的系統目前在做一個驗證的機制
當第一次建立資料的時候會紀錄資料建立時間[Created Time]
此時有驗證的權限者會來檢核資料如果通過[InFo]這個欄位就會給True值
但是當這一筆資料有做變更或變動的話就會[Update Time]紀錄到資料庫
並且將[InFo]這個欄位給False值,讓驗證權限者再次做驗證

@@ 不知道大大有沒有看懂 我是程式的新手 如果有更好的程式規畫 還煩請指教
同時也將[Update_Time]資料UPDATE 到[Creat_Time]
因為建立時間 就是 建立時間,你把它改成 Update_Time ,然後 建立時間的資訊消失,
留下兩個 Update_Time. 這樣有何意義???
Albert iT邦高手 1 級 ‧ 2018-04-04 13:02:28 檢舉
我們是在應用系統底層將任何修改
存入Log
何人何時從哪一個ip進入用哪一台電腦用哪一個帳號
將哪一個欄位從 XX 改成 XX
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
暐翰
iT邦大師 1 級 ‧ 2018-04-03 15:16:00
最佳解答

結果圖:

CODE:

--【以下建立測試資料數據】
create table #Tem_Table ([Creat_Time] datetime,[Update_Time] datetime,[InFo] nvarchar(5));
insert into #Tem_Table ([Creat_Time],[Update_Time] ,[InFo]) values 
	('2018/04/03 12:00:00.000','2018/04/03 12:00:00.000','False')
    ,('2018/02/03 12:00:00.000','2018/03/04 12:00:00.000','False')  
    ,('2018/03/03 12:00:00.000','2018/01/04 12:00:00.000','False')  
;

--原先資料打印
select * from #Tem_Table;

--更新動作
update #Tem_Table
set [Creat_Time] = case when not [Creat_Time]=[Update_Time] then [Update_Time] else [Creat_Time]  end
    ,[InFo] = case when not [Creat_Time]=[Update_Time] then 'True'else [InFo]  end

--更新資料打印
select * from #Tem_Table;

先看一下,有問題再跟我說 :-)

小火車 iT邦新手 4 級 ‧ 2018-04-03 16:36:14 檢舉

大大我這樣解讀對嗎

set [Creat_Time] = case when not [Creat_Time]=[Update_Time] then [Update_Time] else [Creat_Time]  end

(這一段是 當 Creat_Time 不等於 Update_Time 那就把Update_Time 值給 Creat_Time)

[InFo] = case when not [Creat_Time]=[Update_Time] then 'True'else [InFo]  end

(這一段是 當 Creat_Time 不等於 Update_Time 那就把 'True' 值給 InFo)
另外如果我把這段SQL語法放到C#連線字串上好像沒動作?? 'True'值沒被UPDATE上去

SqlCommand cmd = new SqlCommand("update [Antibiotic_Drog_info] set [Anti_name]='" + p_Anti_name.Text + "', [Dose]='" + p_Dose.Text + "', [Usage]='" + p_Usage.Text + "', [Start_date]='" + p_Start_date.Text + "', [Con_usage]='" + Check_Con_Use + "', [Stop_date]='" + p_Stop_date.Text + "', [Certification] = case when not [Drg_Cre_Time]=[Update_Time] then 'TRUE' else [Certification] end where [Drg_ID]='" + d_id + "' AND FK_Pa_infor_ID='" + Identity_ID + "'", con);
暐翰 iT邦大師 1 級 ‧ 2018-04-03 19:29:35 檢舉

第一段,是的
第二個
你加這段把str_sql的值打印出來看看,照邏輯兩個不相等會修改的

var str_sql = $@"
		update [Antibiotic_Drog_info] set [Anti_name]='{p_Anti_name.Text}', [Dose]='{p_Dose.Text}'
		, [Usage]='{p_Usage.Text}', [Start_date]='{p_Start_date.Text}'
		, [Con_usage]='{Check_Con_Use}', [Stop_date]='{p_Stop_date.Text}'
		, [Certification] = case when not [Drg_Cre_Time]=[Update_Time] then 'TRUE' else [Certification] end
		where [Drg_ID]='{d_id}' AND FK_Pa_infor_ID='{Identity_ID}'
	"

最後盡量不用SQL字串拼接,會被刪DB的 [Postx1] 攻擊行為-SQL 資料隱碼攻擊SQL injection

小火車 iT邦新手 4 級 ‧ 2018-04-04 08:53:56 檢舉

謝謝大大的指點 我知道錯誤在哪了
程式已經可以正常

0
阿海
iT邦新手 2 級 ‧ 2018-12-28 17:08:01
declare @A table(
	Creat_Time date ,InFo varchar(10),Update_Time date
)
insert into @A
values ('20180101','T1','20180801')
    ,  ('20180101','T2','20180701')
    ,  ('20180301','T3','20180301')
    ,  ('20180102','T4','20180102')
select * from @A --原始資料
------------------------------
declare @Creat_Time date, @Update_Time date
if ( @Creat_Time != @Update_Time)
	select * from @A
    update @A set  Creat_Time = Update_Time

select * from @A --變更後資料

我要發表回答

立即登入回答