我应该在我的SQL存储过程中添加If Exists吗?

时间:2011-10-28 13:17:28

标签: sql sql-server-2005 sql-function

下午全部,

我在网页上有一个按钮,当用户点击该按钮时,会将数据插入到表格中。此按钮有一个分配给它的消息框,让用户知道记录已保存,然后将用户重定向到主页。这在目前的状态下完美无缺。

我的问题是我希望找到一个解决方案来阻止用户返回此按钮所在的页面并再次插入数据。我需要在数据库表中找到重复记录。

我假设从我在互联网上看到的内容我应该在我的存储过程中使用'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
        ')

非常感谢任何帮助或建议。

关心贝蒂。

3 个答案:

答案 0 :(得分:1)

防止重复的一种非常简单的方法是在要保持与众不同的字段上添加UNIQUE INDEX

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

如果您尝试为列出的字段插入重复值,则会抛出错误。

或者,如果尝试插入重复值,则可以将选项IGNORE_DUP_KEY = ON添加到上面以继续。将生成警告,但不会导致查询失败。

这具有最小的开销,不需要您进行任何维护工作。

答案 1 :(得分:0)

当您说“重复”时,您的意思是TagName的副本吗?如果是这样,最简单的解决方案是在表中的该字段上使用唯一约束。或者您也可以使用AFTER INSERT触发器来检查TagName是否已经存在(可能是VALUE的组合?),如果是,那么ROLLBACK该事务。< / p>

答案 2 :(得分:0)

我会做一个If EXISTS

基本上只做

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

然后当您执行SP时,如果它返回0,您就会知道它有错误,并且您可以向用户显示有关插入重复数据的消息。这种方法意味着您可以检测查询的结果,如果由于重复而未插入,您可以显示相应的消息,它还会确认您已插入记录。