SORU
4 AĞUSTOS 2010, ÇARŞAMBA


Eğer bir satır ekleme'In zaten var sadece

Her zaman bir şey elde etmek için aşağıdaki gibi kullanılır:

INSERT INTO TheTable
SELECT
    @primaryKey,
    @value1,
    @value2
WHERE
    NOT EXISTS
    (SELECT
        NULL
    FROM
        TheTable
    WHERE
        PrimaryKey = @primaryKey)

...ama bir kez yük altında, birincil anahtar ihlali oluştu. Bu hiç de bu tabloya ekler olan tek ifadesi. Yani bu yukarıdaki deyimi atom değildir anlamına mı geliyor?

Sorun bu neredeyse imkansız olacak yeniden.

Belki de aşağıdaki gibi bir değişiklik yapabilirim:

INSERT INTO TheTable
WITH
    (HOLDLOCK,
    UPDLOCK,
    ROWLOCK)
SELECT
    @primaryKey,
    @value1,
    @value2
WHERE
    NOT EXISTS
    (SELECT
        NULL
    FROM
        TheTable
    WITH
        (HOLDLOCK,
        UPDLOCK,
        ROWLOCK)
    WHERE
        PrimaryKey = @primaryKey)

Ancak, belki de yanlış kilitler kullanarak veya kilitleme falan çok fazla kullanıyorum.

Cevaplar "(SELECT COUNT(*) ... EKLE" vb., EĞER bir önerme olduğu stackoverflow.com diğer sorular gördüm ama her zaman tek bir SQL deyimi atom olacağını (belki de yanlış) varsayımı altında oldu.

Herkes herhangi bir fikir var mı?

Teşekkürler.

Adam

CEVAP
4 AĞUSTOS 2010, ÇARŞAMBA


Ne "JFDI" desen?

BEGIN TRY
   INSERT etc
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH

Cidden, bu en hızlı ve eşzamanlı özellikle yüksek seste kilitler. Bu UPDLOCK tırmandı ve bütün tablo kilitliyse?

Read lesson 4

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Hollyscoop

    Hollyscoop

    30 Ocak 2007
  • Kenneth Håkonsen

    Kenneth Håk

    13 Mart 2011
  • Submissions101

    Submissions1

    23 ŞUBAT 2007