none
SELECT SCOPE_IDENTITY() RRS feed

  • Soru

  • Merhaba Arkadaşlar,

    Daha önce sorgularımda Select Scope_Identity ile geri id döndürüyorum fakat aynı tarz sorguda son id döndüremiyorum yapımda tek fark tablomda Identity Specification (Is Identity) No olması bunla bir alakası olabilir mi  var sa son id başka hangi yolla geri alabilirim.


    Cezakellahu Hayran

    8 Aralık 2015 Salı 13:39

Yanıtlar

  • OUTPUT kullanımını araştırabilirsin. Insert, Update, Delete ve Merge işlemlerinde etkilenen satırlardan geriye değer almak için kullanılır. 

    Insert Into TabloAdı Output Inserted.AlanAdi Values(AlanDeğerleri)
    gibi



    Her şeyi denediğin halde yapamadıysan henüz denemediğin şeyler var demektir.

    8 Aralık 2015 Salı 14:58
  • Burda çalışan kodlar var

                using (SqlConnection connection = new SqlConnection(@"Server=.\SQLEXPRESS; Initial Catalog=TestDatabase; Integrated Security = true;"))
                {
                    SqlCommand command = connection.CreateCommand();
                    command.CommandText = "Insert INTO Test(ID, ad, soyad) Output INSERTED.ID Values(@ID, @ad, @soyad)";
    
                    command.Parameters.Add("@ID", System.Data.SqlDbType.Int);
                    command.Parameters.Add("@ad", System.Data.SqlDbType.NVarChar);
                    command.Parameters.Add("@soyad", System.Data.SqlDbType.NVarChar);
                    for(int i = 0; i< 15; i++)
                    {
                        command.Parameters["@ID"].Value = i;
                        command.Parameters["@ad"].Value = "Olcay " + i.ToString();
                        command.Parameters["@soyad"].Value = "GÜZEL " + i.ToString();
                        connection.Open();
                        int id = (Int32)command.ExecuteScalar();
                        connection.Close();
                        listBox1.Items.Add(string.Format("{0} ID'li kayıt veritabanına eklendi", id));
                        Application.DoEvents();
                    }
                }


    Her şeyi denediğin halde yapamadıysan henüz denemediğin şeyler var demektir.


    • Düzenleyen Olcay GUZEL 11 Aralık 2015 Cuma 11:26
    • Yanıt Olarak İşaretleyen Esiardieyar 11 Aralık 2015 Cuma 13:57
    11 Aralık 2015 Cuma 11:20
  • Yukarıdaki kodlarda çalışıyor da. Yine de gözümden kaçan bir kısmı düzeltmek istedim. 

    connection.Open ve connection.Close satırlarını döngünün başlangıç ve bitişine alırsan sürekli olarak bağlantı açıp kapamaya uğraşmaz. Yani

                    connection.Open();
                    for (int i = 0; i < 15; i++)
                    {
                        command.Parameters["@ID"].Value = i;
                        command.Parameters["@ad"].Value = "Olcay " + i.ToString();
                        command.Parameters["@soyad"].Value = "GÜZEL " + i.ToString();
                        int id = (Int32)command.ExecuteScalar();
                        listBox1.Items.Add(string.Format("{0} ID'li kayıt veritabanına eklendi", id));
                        Application.DoEvents();
                    }
                    connection.Close();
    şeklinde


    Her şeyi denediğin halde yapamadıysan henüz denemediğin şeyler var demektir.

    • Yanıt Olarak İşaretleyen Esiardieyar 11 Aralık 2015 Cuma 13:58
    11 Aralık 2015 Cuma 12:41

Tüm Yanıtlar

  • Merhaba ;

     SELECT * FROM tablo ORDER BY sıralamayap DESC LIMIT 1 

    bunu bir deneyin ...  İyi çalışmalar ...

    8 Aralık 2015 Salı 14:04
  • identy olmayan bir column u identy gibi çekemezsin. sadece max gibi değerlerle son değeri alabilirsin.

    Select MAX(column) as ID from

    veya dejevu nun dediği yöntemle


    kdrgny@outlook.com

    8 Aralık 2015 Salı 14:37
  • OUTPUT kullanımını araştırabilirsin. Insert, Update, Delete ve Merge işlemlerinde etkilenen satırlardan geriye değer almak için kullanılır. 

    Insert Into TabloAdı Output Inserted.AlanAdi Values(AlanDeğerleri)
    gibi



    Her şeyi denediğin halde yapamadıysan henüz denemediğin şeyler var demektir.

    8 Aralık 2015 Salı 14:58
  • Yanıt işaretini kim koydu anlayamadım :)  Output Inserted olayını denedim bu arada colon özelliği idenity sadece Is Identity, No  birde kayıt işlemini transaction içerisinde yapmaktayım max ile son id alamıyorum bu yüzden o an kayıt yaptığı anda yapmam lazım ve bu tablo altında trigger da çalışmakta .

    Cezakellahu Hayran

    8 Aralık 2015 Salı 22:34
  • Üretilen identity i yakalamanın bir çok yolu var. Kod paylaşmadığınız için bir şey demek çok zor ancak bir kaç yazı paylaşayım ki çok kısalar zaten çerezlik :). Açıkçası pek faydalı olacağını düşünmüyorum büyük ihtimalle yazılarda olanları biliyorsundur ama yinede paylaşayım.

    http://www.enginpolat.com/identity-scope_identity-ve-ident_current-arasindaki-farklar/

    http://erginarslan.blogspot.com.tr/2011/04/identityscopeidentity-ve-identcurrent.html

    http://www.semgoksu.com/sql-server-identity-degerini-bulmak-yazisi/202.aspx


    gurkanalavanda@gmail.com

    8 Aralık 2015 Salı 22:59
  • Şöyle bir düşün bakalım: İlgili sütunun IsIdentity özelliği No olarak ayarlanmış. Yani Identity değil. Scope_Identity en son identity alanı verdiğine göre ve senin tablondaki sütun identity olmadığına göre çalışır mı?

    Her şeyi denediğin halde yapamadıysan henüz denemediğin şeyler var demektir.

    9 Aralık 2015 Çarşamba 08:01
  • Yanit isaretini kim koydu anlayamadin mi ???? Orada yazmiyor mu:

    Ben koydum "Cetin Basoz".

    Cunku identity olsa da olmasa da, dogru cevap o.

    Identity olsa bile Scope_Identity() ile her yerde her zaman dogru degeri alamazsin. Max ile de (ya da order by desc gibi) dogru degeri alamazsin. Senin "son"dan kastin kendi insert ettigin deger(ler) degil ise sorunu daha acik ve net sekilde sormalisin. Son dedigin, insert ettigin (ya da ettiklerin) ise cevap output, MS SQL ile de baska bir cevabi yok. SCOPE_IDENTITY() ile iliskilendirerek sorduguna gore "son"dan kastin kendi insert ettigin (ya da ettiklerin).



    9 Aralık 2015 Çarşamba 10:44
    Yanıtlayıcı
  • abicim Output Inserted aynısını yaptım nedense bir türlü ıd alamıyorum

    INSERT INTO TEST(ID, ad,soyad) OUTPUT INSERTED.ID VALUES (@ID, @ad,@soyad)
    cmd.Parameters.AddWithValue("@ID",ID);
    cmd.Parameters.AddWithValue("@ad",ad);
    cmd.Parameters.AddWithValue("@soyad",soyad);
    int id =(Int32)cmd.ExecuteScalar();
    
    int idd = (int)cmd.Parameters["@ID"].Value;
    
    


    Cezakellahu Hayran

    11 Aralık 2015 Cuma 08:30
  • abicim Output Inserted aynısını yaptım nedense bir türlü ıd alamıyorum

    INSERT INTO TEST(ID, ad,soyad) OUTPUT INSERTED.ID VALUES (@ID, @ad,@soyad)
    cmd.Parameters.AddWithValue("@ID",ID);
    cmd.Parameters.AddWithValue("@ad",ad);
    cmd.Parameters.AddWithValue("@soyad",soyad);
    int id =(Int32)cmd.ExecuteScalar();
    
    int idd = (int)cmd.Parameters["@ID"].Value;
    


    Cezakellahu Hayran

    Eğer ID otomatik artan bir değerse sorgu hata veriyor olabilir. ID alanını sorgudan çıkarıp dener misin?

    Her şeyi denediğin halde yapamadıysan henüz denemediğin şeyler var demektir.

    11 Aralık 2015 Cuma 08:34
  • Değil abicim ISIDENTITY no  id sorgudan çıkarttığımda Cannot insert the value NULL into column 'ID', table  hatası veriyor. 3 Gündür bunla uğraşıyorum benim morel 000 :)

    Cezakellahu Hayran


    11 Aralık 2015 Cuma 09:16
  • Yukarıdaki kodları döngü içinde çalıştırıyor olabilir misin? Eğer öyleyse AddWithValue yöntemi yanlış olur. Onun yerine

    cmd.CommandText = "INSERT INTO TEST(ID, ad, soyad) OUTPUT INSERTED.ID VALUES(@ID, @ad, @soyad) ";
    cmd.Parameters.Add("@ID");
    cmd.Parameters.Add("@ad");
    cmd.Parameters.Add("@soyad");
    for(.....) //veya hangi döngü olacaksa
    {
      cmd.Parameters["@Id"].Value = ID;
      cmd.Parameters["@ad"].Value = ad;
      cmd.Parameters["@soyad"].Value = soyad;
      int id =(Int32)cmd.ExecuteScalar();
      MessageBox.Show(id.ToString());
    }
    AddWithValue döngü içinde kullanıldığında aynı parametreyi tekrar tekrar eklemeye çalıştığı için hata verir. 


    Her şeyi denediğin halde yapamadıysan henüz denemediğin şeyler var demektir.

    11 Aralık 2015 Cuma 09:32
  • Olcay abi döngü içinde senin gösterdiğin gibi yaptım An SqlParameter with ParameterName 'ID' is not contained by this SqlParameterCollection. hatası veriyor.

    Cezakellahu Hayran

    11 Aralık 2015 Cuma 09:52
  • Benim hatam sanırım büyük-küçük harf farkından kaynaklanıyor. bir tanesi @ID diğeri @Id onların ikisini de aynı yaparak çalıştırır mısın? Bir de kodların tamamını paylaşır mısın? Belki öncesinde eksik olan bir şey vardır ama göremiyoruzdur. 

    Her şeyi denediğin halde yapamadıysan henüz denemediğin şeyler var demektir.

    11 Aralık 2015 Cuma 11:08
  • Burda çalışan kodlar var

                using (SqlConnection connection = new SqlConnection(@"Server=.\SQLEXPRESS; Initial Catalog=TestDatabase; Integrated Security = true;"))
                {
                    SqlCommand command = connection.CreateCommand();
                    command.CommandText = "Insert INTO Test(ID, ad, soyad) Output INSERTED.ID Values(@ID, @ad, @soyad)";
    
                    command.Parameters.Add("@ID", System.Data.SqlDbType.Int);
                    command.Parameters.Add("@ad", System.Data.SqlDbType.NVarChar);
                    command.Parameters.Add("@soyad", System.Data.SqlDbType.NVarChar);
                    for(int i = 0; i< 15; i++)
                    {
                        command.Parameters["@ID"].Value = i;
                        command.Parameters["@ad"].Value = "Olcay " + i.ToString();
                        command.Parameters["@soyad"].Value = "GÜZEL " + i.ToString();
                        connection.Open();
                        int id = (Int32)command.ExecuteScalar();
                        connection.Close();
                        listBox1.Items.Add(string.Format("{0} ID'li kayıt veritabanına eklendi", id));
                        Application.DoEvents();
                    }
                }


    Her şeyi denediğin halde yapamadıysan henüz denemediğin şeyler var demektir.


    • Düzenleyen Olcay GUZEL 11 Aralık 2015 Cuma 11:26
    • Yanıt Olarak İşaretleyen Esiardieyar 11 Aralık 2015 Cuma 13:57
    11 Aralık 2015 Cuma 11:20
  • Yukarıdaki kodlarda çalışıyor da. Yine de gözümden kaçan bir kısmı düzeltmek istedim. 

    connection.Open ve connection.Close satırlarını döngünün başlangıç ve bitişine alırsan sürekli olarak bağlantı açıp kapamaya uğraşmaz. Yani

                    connection.Open();
                    for (int i = 0; i < 15; i++)
                    {
                        command.Parameters["@ID"].Value = i;
                        command.Parameters["@ad"].Value = "Olcay " + i.ToString();
                        command.Parameters["@soyad"].Value = "GÜZEL " + i.ToString();
                        int id = (Int32)command.ExecuteScalar();
                        listBox1.Items.Add(string.Format("{0} ID'li kayıt veritabanına eklendi", id));
                        Application.DoEvents();
                    }
                    connection.Close();
    şeklinde


    Her şeyi denediğin halde yapamadıysan henüz denemediğin şeyler var demektir.

    • Yanıt Olarak İşaretleyen Esiardieyar 11 Aralık 2015 Cuma 13:58
    11 Aralık 2015 Cuma 12:41
  • Teşekkür ederim abim çok güzel oldu eline ve emeğine sağlık.

    Cezakellahu Hayran

    11 Aralık 2015 Cuma 13:58
  • Ben de Olcay'in ornegine bir ek yapmistim, neden output daha onemli ve guvenilir, gosteriyor. Ben gonderemeden telekomdan fiber internet gitti, ancak geldi :)

    string sql = @"DECLARE @myIDTable table (theID int);
    
    WITH  dataGenerator ( SiraNo )
          AS (
               SELECT TOP 100
                      ROW_NUMBER() OVER ( ORDER BY t1.object_id ) 
               FROM   master.sys.all_columns t1
               CROSS JOIN master.sys.all_columns t2
             )
    INSERT INTO Test
       (Id, ad, soyad) 
          Output inserted.Id into @myIdTable 
       select SiraNo, 
        'Ad #'+cast(SiraNo as varchar(4)),
        'Soyad #'+cast(SiraNo as varchar(4))
     from dataGenerator;
    
     select * from @myIdTable;";
    
    var adapter = new SqlDataAdapter(sql,
      @"Server=.\SQLEXPRESS2012;database=TestDatabase;Trusted_connection=yes;");
    DataTable sonuc = new DataTable();
    adapter.Fill(sonuc);
    Not: Ben sadece Id'leri aldim ama istedigin kadar kolonu alabilirsin.

    11 Aralık 2015 Cuma 15:57
    Yanıtlayıcı
  • Çok teşekkür ediyorum.

    Cezakellahu Hayran

    12 Aralık 2015 Cumartesi 08:08