2011-10-28 141 views
0

下午所有,我應該添加如果存在我的SQL存儲過程?

我在網頁上有一個按鈕,當用戶點擊時將數據插入到表中。此按鈕有一個消息框分配給它,讓用戶知道記錄已保存,然後將用戶重定向到主頁。這在目前的狀態非常好。

我的問題是,我希望找到一個解決方案,以停止用戶返回到該按鈕所在的頁面並再次插入數據。我需要在數據庫表中重複記錄。

我假設從我在互聯網上讀到的,我應該在我的存儲過程中使用'IF EXISTS'函數。我不是100%確定這將如何與我的存儲過程中使用的當前代碼一起工作?我只想檢查這些記錄是否可用,如果沒有,那麼添加它們或者如果它們已經存在,則不添加這些記錄。

我只是覺得我已經在網上閱讀的文章數量等方面感到困惑。

這裏是我當前的存儲過程:

ALTER PROCEDURE [dbo].[GasNominationsRawData_Insert] 

AS SET NOCOUNT ON; 

INSERT INTO dbo.GasRawData (timestamp,TagName,Value) 

    SELECT timestamp AS Interval, Left(Right(TagName,Len(TagName)-5),Len(TagName)-10) As TagName, 
    CONVERT(decimal(10, 2), ROUND(value, 2)) As Value 
    FROM 
     OPENQUERY(IHISTORIAN,' 
     SET starttime =''yesterday +4h'', endtime =''today +6h'' 
     SELECT timestamp, tagname, value 
     FROM ihRawData 
     WHERE tagname = "UMIS.99FC9051.F_CV" 
      OR tagname = "UMIS.99F851C.F_CV" 
      OR tagname = "UMIS.35GTGAS.F_CV" 
      OR tagname = "UMIS.99XXG546.F_CV" 
     AND timestamp BETWEEN ''timestamp'' and ''timestamp'' 
     AND SamplingMode =Calculated 
     AND CalculationMode =Average 
     AND IntervalMilliseconds =1h 
     ORDER BY tagname, timestamp 
     ') 

任何幫助或建議,將不勝感激。

關注貝蒂。

回答

1

防止重複的一種非常簡單的方法是在要保持特色的字段上添加UNIQUE INDEX。如果您嘗試插入上市領域的重複值

CREATE UNIQUE INDEX ix_MyIndexName ON Table(Field1, Field2, Field3)

這將拋出一個錯誤。

或者,如果嘗試插入重複值,則可以將選項IGNORE_DUP_KEY = ON添加到上面以繼續。將會生成警告,但不會導致查詢失敗。

這具有最小的開銷,並且不需要您執行任何維護工作。

+0

下午JNK,創建一個唯一的索引我覺得聽起來不錯。不過,我只想檢查它是否會對一些示例記錄起作用。我在DB中的表格列是'timestamp','tagname'和'Value'。 DB中的示例記錄(僅適用於兩個標籤)如下所示:(時間戳,標記名,值)27/10/2011 05:00 99F851C 0.03,27/10/2011 06:00 99F851C 0.03,27/10/2011 05:00 99FC9051 14.62,27/10/2011 06:00 99FC9051 13.66。請參閱下一部分的評論... – Betty

+0

本質上會有重複的'時間戳',因爲我的查詢從每天早上05:00到當前日期06:00爲每個標記拉回小時間隔。所以我需要確保重複項不是個人'時間戳'+'標記名'的重複項。 CREATE UNIQUE INDEX DupRecords ON GasRawData(時間戳,標記名)是否工作? – Betty

+0

它應該,是的。 – JNK

0

當你說「重複」時,你的意思是重複的TagName?如果是這樣,最簡單的解決方案是在表中的該字段上使用唯一約束。或者,您也可以使用觸發器來檢查TagName是否已經存在(可能與VALUE?的組合),如果是,則使用ROLLBACK該事務。

+0

有問題的「重複」記錄是'時間戳'和'標記名'的記錄。上述每個指定的「標記名」都有小時間隔的數據。上面的查詢將每個標記名的起始時間從前一天的上午05:00到當前日期的上午06:00逐個拉回26小時? – Betty

0

我會做一個是否存在

基本上只是做

IF EXISTS(select * from wherever where something = something) 
BEGIN 
-- Return an error here 
Return 0 
END 
ELSE 
BEGIN 
-- Insert Code Goes Here 
Return 1 
END 

然後,當你exec的你的SP如果返回0,你知道它誤,您可以對插入重複到您的用戶顯示的消息數據。這種方法意味着您可以檢測查詢的結果,如果由於重複而未插入,您可以顯示適當的消息,它也會讓您確認記錄已插入。

相關問題