Agar mening SQL saqlangan amaliyotim mavjud bo'lsa, ilova kerakmi?

Kunduzgi hamma,

Men veb-sahifada tugmachani bosib, foydalanuvchining jadvalga ma'lumot qo'shishini taklif qilaman. ushbu tugma unga tayinlangan xabarlar qutisiga ega, foydalanuvchining yozuvlar saqlanganligini bilishi va undan keyin foydalanuvchini bosh sahifaga yo'naltiradi. Bu hozirgi holatida juda yaxshi ishlaydi.

Muammo shundaki, men ushbu tugma joylashgan sahifaga qaytib, ma'lumotni qaytadan kiritishni to'xtatish uchun echimni topishni istayman. Ma'lumotlar bazasi stolida ikki nusxadagi yozuvlarni o'z ichiga olishi kerak.

Internetda o'qigan narsamdan "if IF EXISTS" funktsiyasini saqlangan amaliyotimdan foydalanishim kerakligini taxmin qilaman. Men ushbu amaldagi kod bilan qanday ishlashini 100% ishonchim komil emas. Men faqatgina ushbu yozuvlar mavjudligini tekshirishni istayman va agar ularni qo'shmasangiz yoki ularni qo'shsangiz, ularni qo'shmasligingiz kerak.

Men faqat Internetda o'qigan maqolalar va boshqalar bilan o'zimni biroz chalkashtirib yuborganman deb o'ylayman.

Hozirda saqlangan amaliyotim:

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
        ')

Har qanday yordam yoki taklifni yuqori baholaysiz.

Betti haqida.

0

3 javoblar

Ikki nusxadagi ma'lumotlarni oldini olishning oddiy usullaridan biri, farqlashni xohlagan joylarda UNIQUE INDEX ni kiritishdir.

UNIQUE INDEX ix_MyIndexName Jadvalni (Field1, Field2, Field3) yarating

Agar royxatdagi maydonlar uchun ikki nusxadagi qiymatni qo'shishga harakat qilsangiz, bu xato bo'ladi.

Shu bilan bir qatorda, ikki nusxadagi qiymatni qo'shishga harakat qilinsa davom etish uchun IGNORE_DUP_KEY = OShKOR variantini yuqoriga qarab qo'shishingiz mumkin. Bir ogohlantirish yaratiladi, ammo so'rovning bajarilmasligiga sabab bo'lmaydi.

Bu minimal yukga ega va hech qanday parvarishlash ishlarini bajarishni talab qilmaydi.

1
qo'shib qo'ydi
Peshindan keyin JNK, UNIQUE INDEX ni yaratish Menimcha, tovushlar yaxshi. Biroq, ba'zi namunaviy yozuvlarga qarshi ishlashini tekshirishni istardim. Jadvaldagi jadval ustunlarim "timestamp", "tagname" va "Value". Jadvalda namuna yozuvlari (faqat ikkita teg uchun) quyidagilarga o'xshaydi: (Timestamp, tagname, Value) 27/10/2011 05:00 99F851C 0.03, 27/10/2011 06:00 99F851C 0.03, 27/10/2011 05:00 05:00 99.9051 14.62, 27/10/2011 06:00 99FC9051 13.66. Iltimos, fikrning keyingi qismiga qarang ...
qo'shib qo'ydi muallif Betty, manba
Mening so'rovlarim har kuni soat 05:00 dan 06:00 gacha bo'lgan har bir teg uchun soat oralig'ini qaytaradi, aslida takroriy "vaqt tamg'asi" bo'ladi. Shunday qilib, duplikatlarning "timestamp" + "tagname" ning emasligiga ishonch hosil qilishim kerak. Yagona indeksni yaratmoqdamiz DupRecords GasRawData (Timestamp, tagname) da ishlaydi?
qo'shib qo'ydi muallif Betty, manba
Salom JNK, Ha, indeks yaratish shunga o'xshash ishni qildi. Biroq, men buni qanday qilib amalga oshirish kerakligiga ishonchim komil emasligi uchun endi istisno bor. "DboRecords" dbo.GasRawData "dagi ikki nusxadagi kalit qatorni" DupRecords "indeksiga kiritib bo'lmadi. Vb sahifasida dbcommand.ExecutedNonQuery() qatoriga ishora qilasizmi? Men yordam bera olamanmi, agar kodni ishlatish tugmachasini yuqoriga ko'tarib o'qishga harakat qilaman?
qo'shib qo'ydi muallif Betty, manba
Himoyalangan pastki btnAddRawData_Click (ByVal jo'natuvchisi sifatida ob'ekt sifatida, ByVal e As System.EventArgs) btnAddRawData.Clickni ishlatadi. New sqlConnection (ConfigurationManager.AppSettings (dbconnection & zwnj;)) dbconnection dan foydalanish dbconnection.Open() dbcommand dan foydalanish SqlCommand = dbconnection.CreateCommand Dbcommand bilan .CommandType = CommandType.StoredProcedure .CommandText = "GasNominationsRawData_Insert" dbcommand.ExecuteNonQuery() End End With End End Sub End End foydalanishni yakunlash
qo'shib qo'ydi muallif Betty, manba
Vaqtingiz uchun juda minnatdormiz.
qo'shib qo'ydi muallif Betty, manba
Ha, ha.
qo'shib qo'ydi muallif JNK, manba
Men aytib o'tgan kodni IGNORE_DUP_KEY = O'N dan foydalanishingiz yoki xatolarni tuzatishingiz kerak.
qo'shib qo'ydi muallif JNK, manba
@Betty - aytib o'tganimdan foydalaning. Agar ilova bilan bog'liq muammo bo'lsa, yangi savol oching.
qo'shib qo'ydi muallif JNK, manba

Men agar qilsam qilaman

Asosan faqat qil

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

So'ngra, agar siz SPni ishga tushirgan bo'lsangiz, u xato qilganini bilsangiz va foydalanuvchiga ikki nusxadagi ma'lumotlarni kiritish haqida xabarni ko'rsatishingiz mumkin. Ushbu yondashuv siz so'rov natijalarini aniqlab olishingiz mumkin va agar u nusxalar tufayli kiritilmagan bo'lsa, sizga tegishli xabarni ko'rsatishi mumkin, u sizga yozuv kiritilganligini tasdiqlaydi.

0
qo'shib qo'ydi

"Ikki nusxadagi" deb aytsangiz, TagName dublikatini bildirasizmi? Agar shunday bo'lsa, eng qulay echim, bu sohada stol ustida noyob cheklovni qo'llash bo'ladi. Yoki bu TagName allaqachon mavjud bo'lganligini tekshirish uchun ( VALUE kombinatsiyasi bilan bog'liqmi?) Va agar shunday bo'lsa, tekshirish uchun AFTER INSERT keyin ROLLBACK jarayonini tanlang.

0
qo'shib qo'ydi
Ushbu "Duplicate" yozuvlari''Testame 'va' tagname 'yozuvlari hisoblanadi. Yuqoridagi ko'rsatilgan "tagnames" ning har biri soatlik oraliq ma'lumotlarga ega. Yuqoridagi so'rov avvalgi kun soat 05:00 dan boshlab joriy sananing 06:00 gacha boshlangan har bir tagname uchun 26 soatlik oraliqni qaytarib oladimi?
qo'shib qo'ydi muallif Betty, manba