Должен ли я добавить, если существует, к моей хранимой процедуре SQL? - PullRequest
0 голосов
/ 28 октября 2011

Послеобеденное все,

У меня есть кнопка на веб-странице, которая при нажатии пользователем вставляет данные в таблицу.этой кнопке назначено окно сообщения, чтобы пользователь знал, что записи были сохранены, а затем перенаправляет пользователя на домашнюю страницу.Это в своем нынешнем состоянии прекрасно работает.

Моя проблема в том, что я хочу найти решение, чтобы пользователь не возвращался на страницу, где расположена эта кнопка, и снова вставлял данные.Мне нужно обойти, имея дубликаты записей в таблице базы данных.

Я предполагаю, что из того, что я прочитал в Интернете, я должен использовать функцию «ЕСЛИ СУЩЕСТВУЕТ» в моей хранимой процедуре.Я не уверен на 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 ]

1 голос
/ 28 октября 2011

Один очень простой способ предотвращения дубликатов - добавить UNIQUE INDEX в поле (поля), которое вы хотите оставить отличительным.

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

Это выдаст ошибку, если вы попытаетесь вставить дублирующее значение для перечисленных полей.

В качестве альтернативы, вы можете добавить опцию IGNORE_DUP_KEY = ON к описанному выше, чтобы продолжить, если попытается вставить дублирующееся значение. Будет сгенерировано предупреждение, но оно не приведет к сбою запроса.

Это имеет минимальные накладные расходы и не потребует от вас никаких работ по техническому обслуживанию.

0 голосов
/ 28 октября 2011

Я бы сделал, если существует

В основном просто сделайте

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, вы знаете, что он ошибся, и вы можете отобразить сообщение для вашего пользователя о вставке дублирующих данных. Этот подход будет означать, что вы можете обнаружить результат запроса и, если он не был вставлен из-за дубликатов, вы можете отобразить соответствующее сообщение, это также даст вам подтверждение, что запись была вставлена.

0 голосов
/ 28 октября 2011

Когда вы говорите «дубликат», вы имеете в виду дубликат TagName? Если это так, то самым простым решением будет использование уникального ограничения для этого поля в таблице. Или вы можете также использовать триггер AFTER INSERT, чтобы проверить, существует ли уже TagName (возможно, с комбинацией VALUE?), И если да, то ROLLBACK транзакция.

...