各位前輩好
我原本的SQL語法,如下:
string strSQL = " IF NOT EXISTS(SELECT test1 FROM test WHERE test1 = @test1)" +
" BEGIN" +
" INSERT INTO test()" +
" VALUES()" +
" END " +
" ELSE " +
" BEGIN" +
" UPDATE test " +
" SET " +
" WHERE " +
" END";
但發現我的資料來源,應該說是無key值,可能每個欄位都需比對是否有重複。然而,查看之前PB所寫的程式,有SQLCA.SQLCODE < 0 這個語法可以判斷是要執行insert還是update,查詢C#有SQLException在處理這部分,但不知道怎麼使用,可以教我嗎? 感激不盡!
#20180723後續
經過詢問資料來源提供者,此表的確沒有key值,若是需要key值,則需要提出申請,在Oracle的view上新增key值,所以我就先假定幾個欄位做key值,關於資料會重複的問題,暫時先不處理了,反正目前也還沒有程式會用到這個資料表,謝謝各位協助。
您可以先用 Update , UPDATE 結果 再決定INSERT
BEGIN
UPDATE test SET test1= N'????' WHERE test1 = @test1 ;
IF @@ROWCOUNT = 0
BEGIN
PRINT 'insert~'
END
END
@@ROWCOUNT ==> 保留來自前一個陳述式執行的 @@ROWCOUNT。
邏輯就是
UPDATE 0筆,表示沒有此資料,下一步INSERT
UPDATE 大於0筆,表示有此資料,下一步離開
不要說有UPDATE 小於 0筆,
但是我WHERE條件值,不知道要用哪一個!! 謝謝!
怎麼可能,您不知道??
您知道您要更新的資料是哪一筆吧,
那這一筆您怎樣找出來,就用找出來的條件,去下WHERE 條件值。
回TWLuke大,如我在頂樓最下面所提的,就暫時先不處理這個問題了,由於你建議的方法也不錯用,所以就選你為最佳解答囉,感謝協助。
方法1,分兩次作,
第一次Select,C#判斷有沒有抓到資料,
有就Update,沒有就Insert,
方法2,
在 SQL Server 中可以這樣處理:
if not exists (select 1 from t where id = 1)
insert into t(id, update_time) values(1, getdate())
else
update t set update_time = getdate() where id = 1
請問select 1 from t where id = 1 是代表什麼意思呢?
就等於 你的新增/修改條件 SELECT 1 FROM test WHERE test1 = @test1
但現在的狀況是我的目標資料表沒有key值,若是我加入where條件值去判斷,會發生目標資料表沒有資料,程式卻跑update,導致該筆資料lost掉。
(select 1 from t where id = 1)
也可以換成很複雜的判斷方式,
只要這一段有抓到資料就跑Update,
沒有抓到資料就跑Insert
目標資料表沒有資料
應該是會跑Insert
回小魚大,我使用您的方法2,也先將資料表清空,但是跑完程式不會有任何資料新增。
你先把程式碼PO上來吧...
抱歉小魚大,因我先去寫比較簡單明確有KEY值的程式,所以比較慢回覆您,我修改的T-SQL語法如下:
string strSQL = " IF NOT EXISTS(SELECT 1 FROM TEST WHERE ID = 1 )" +
" BEGIN" +
" INSERT INTO TEST()" +
" SELECT 'INSERT' " +
" END" +
" ELSE " +
" BEGIN" +
" UPDATE TEST " +
" SET DATECREATED = @DATECREATED,CREATEUSER = @CREATEUSER " +
" WHERE ID = 1 " +
" SELECT 'UPDATE' " +
" END";