Stored Prosedür’de XML Input | MsSql

Merhaba,

SQL’de stored prosedür kullanımı yönetim açısından kolaylıklar sağladığından kullanmayı tercih ediyorum. Şimdiye kadar çoklu kayıt güncellemelerinde 15-20 kayıt güncellemem gerektiği durumlarda bir döngü içerisinde tek tek çağırıyordum SP’yi. Açıkcası çok da sıkıntı olmuyordu.

Ancak kayıt sayısı arttıkça bu döngüler performansa negatif etki edebiliyor.

Bu sebeple toplu güncelleme ihtiyacım doğdu. Onu da şu şekilde hallettim.

Lazım olan olursa diyerek buraya bırakıyorum:

C#

foreach (UrunTedarikci item in diziUrunTedarikci)
{
    bfrXml.Append("<row");
    bfrXml.Append(" Id=\"");
    bfrXml.Append(item.Id);
    bfrXml.Append("\"");
    bfrXml.Append(" FirmaKodu=\"");
    bfrXml.Append(item.FirmaKodu);
    bfrXml.Append("\"");
    bfrXml.Append(" TedarikciKodu=\"");
    bfrXml.Append(item.TedarikciKodu);
    bfrXml.Append("\"");
    bfrXml.Append(" TedarikciAdi=\"");
    bfrXml.Append(item.TedarikciAdi);
    bfrXml.Append("\"");
    bfrXml.Append(" GuncelleyenKullaniciId=\"");
    bfrXml.Append(this.GecerliKullanici.Id.ToString());
    bfrXml.Append("\" />");
}
List<SqlParameter> lstParametreler = new List<SqlParameter>() { new SqlParameter() { ParameterName = "@TedarikciXml", Value = bfrXml.ToString().Replace(@"\", @"") , Direction = ParameterDirection.Input, DbType = DbType.Xml } };
int etkilenenKayitSayisi = executeInsertUpdateDelete("PRC_TEDARIKCIGUNCELLE", lstParametreler);      

private int executeInsertUpdateDelete(string spIsim, List<SqlParameter> spParametreleri)
{
    int etkilenenKayitSayisi = 0;
    using (SqlConnection con = new SqlConnection(getirBaglantiCumlesi()))
    {
        using (SqlCommand cmd = new SqlCommand(spIsim, con) { CommandTimeout = 40 }) 
        {
            cmd.CommandType = CommandType.StoredProcedure;
            foreach (SqlParameter param in spParametreleri)
            {
                cmd.Parameters.Add(param);
            }
            con.Open();
            etkilenenKayitSayisi = cmd.ExecuteNonQuery();
            con.Close();
        }
    }
    return etkilenenKayitSayisi;
}

Sql Server

CREATE PROCEDURE [dbo].[PRC_TEDARIKCIGUNCELLE] 
    @TedarikciXml XML 
AS 
BEGIN

    UPDATE ut
    SET ut.FirmaKodu = t.v.value('@FirmaKodu', 'varchar(2)')
      , ut.TedarikciKodu = t.v.value('@TedarikciKodu', 'varchar(20)')
      , ut.TedarikciAdi = t.v.value('@TedarikciAdi', 'nvarchar(250)')
      , ut.GuncelleyenKullaniciId = t.v.value('@GuncelleyenKullaniciId', 'int')
      , ut.GuncellemeTarihi = GETDATE()
    FROM UrunTedarikci ut
        INNER JOIN @TedarikciParametreXml.nodes('/row') AS t (v) ON t.v.value('@Id', 'int') = ut.Id;

END;

Selamlar.

Leave a Reply

Your email address will not be published. Required fields are marked *