Ці павінен я дадаць, ці існуе ў маёй 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
        ')

Любая дапамога ці прапановы будуць ацэнены.

З павагай Бэці.

0

3 адказы

Адзін вельмі просты спосаб прадухілення дублікатаў з'яўляецца даданне UNIQUE INDEX на поле (ы) вы хочаце захаваць своеасаблівая.

<Код> CREATE унікальны індэкс ix_MyIndexName на стале (Поле1, Field2, Field3)

Гэта выдасць памылку, калі вы паспрабуеце ўставіць дублікат значэння для палёў у спісе.

Акрамя таго, вы можаце дадаць параметр IGNORE_DUP_KEY = ON да вышэйсказанага, каб працягнуць працу, калі дублікат значэння спрабавалі ўставіць. Папярэджанне будзе згенеравана, але гэта не прымусіць запыт на правал.

Гэта мінімальныя накладныя выдаткі і не запатрабуе ад вас рабіць якія-небудзь працы па тэхнічным абслугоўванні.

1
дададзена
У другой палове дня JNK, Утварэнне UNIQUE INDEX я думаю, добра гучыць. Аднак я хацеў бы, каб праверыць, што яна будзе працаваць супраць некаторых узораў запісаў. Мае слупкі табліцы ў БД «пазнака часу», «тэгам», & »Value». Прыклады запісу (толькі для двух тэгаў) у БД будуць выглядаць наступным чынам: (Отметка, тэг, Value) 2011/10/27 05:00 99F851C 0.03, 27.10.2011 06:00 99F851C 0,03, 27/10/2011 05:00 99FC9051 14,62, 2011/10/27 06:00 99FC9051 13,66. Калі ласка, глядзіце наступную частку каментароў ...
дададзена аўтар Betty, крыніца
Па сутнасці, будзе дубляваць «пазнака часу», як мой запыт адсоўваецца пагадзіннай інтэрвал цэтлікаў для кожнага ўчора 05.00 да бягучай даты 06:00. Таму мне трэба, каб пераканацца, што дублікаты не ў тым, што індывідуальнага «пазнакі часу» + «тэг». СТВАРЫЦЬ Ці UNIQUE DupRecords INDEX ON GasRawData (Timestamp, тэгу) працаваць?
дададзена аўтар Betty, крыніца
Прывітанне JNK, Ды, стварэнне індэкса зрабіў працу як такой. Аднак я зараз ёсць выключэнне, што мне трэба вырашыць, і ім не ўпэўнены, як гэта зрабіць. «Немагчыма ўставіць дублікат ключа радкі ў аб'ект" dbo.GasRawData "з унікальным індэксам 'DupRecords. Заява была спынена.» Гэта адносіцца да лініі dbcommand.ExecutedNonQuery() на старонцы Vb? Я паспрабую і размясціць код уверх для кнопкі яна выкарыстоўваецца ў, калі вы можаце дапамагчы?
дададзена аўтар Betty, крыніца
Абаронены Sub btnAddRawData_Click (ByVal адпраўнік As Object, ByVal е Як System.EventArgs) Ручкі btnAddRawData.Click Выкарыстоўваючы DbConnection As New SqlConnection (ConfigurationManager.AppSettings ( "DbConnection & ZWNJ;")) dbconnection.Open() Выкарыстоўваючы DbCommand Як SqlCommand = dbconnection.CreateCommand З DbCommand .CommandType = CommandType.StoredProcedure .CommandText = "GasNominationsRawData_Insert" dbcommand.ExecuteNonQuery() End With End Using End Using End Sub End Class
дададзена аўтар Betty, крыніца
Зраблю, вялікі дзякуй за ваш час.
дададзена аўтар Betty, крыніца
Ён павінен, так.
дададзена аўтар JNK, крыніца
Вы павінны выкарыстоўваць IGNORE_DUP_KEY = ON , які я згадваў, ці апрацоўваць памылкі.
дададзена аўтар JNK, крыніца
@Betty - выкарыстоўвайце опцыю, я ўжо згадваў. Калі ў вас ёсць праблемы з дадаткам затым адкрыйце новае пытанне.
дададзена аўтар JNK, крыніца

Я хацеў бы зрабіць Умоўны ІСНУЕ

У асноўным проста зрабіць

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 Вы ведаеце, гэта памылковае і вы можаце адлюстраваць паведамленне свайго карыстача аб ўсталёўцы дублюючых дадзеных. Такі падыход будзе азначаць, што вы можаце выявіць вынік запыту і, калі яна не ўсталяваная з-за дубляў можна адлюстраваць адпаведнае паведамленне, яно таксама дасць вам пацверджанне, што запіс ўстаўлена.

0
дададзена

Калі вы кажаце «дублікат», вы маеце на ўвазе дублікат TagName ? Калі так, то самае простае рашэнне было б выкарыстоўваць абмежаванне унікальнасці на гэтым полі ў табліцы. Ці вы можаце таксама выкарыстоўваць ПАСЛЯ INSERT трыгер, каб праверыць, што TagName ужо існуе (магчыма, з дапамогай камбінацыі VALUE ?), І калі так, затым ROLLBACK здзелка.

0
дададзена
У «Дублікат» запісы пра якія ідзе гаворка, з'яўляюцца запісы для the'timestamp »і" тэгам ". Кожны з названых «тэгаў» вышэй, мае дадзеныя з вартавымі інтэрваламі. Вышэй запыт адсоўваецца 26 гадзінных інтэрвалаў для кожнага тэга, якія пачынаюцца ад з 05.00 папярэдняга дня да 06:00 бягучага дня?
дададзена аўтар Betty, крыніца