Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Saat menjalankan prosedur tersimpan, apa keuntungan menggunakan CommandType.StoredProcedure dibandingkan menggunakan CommandType.Text?

Menurut tes di posting blog ini SQL Server akan melakukan parameterisasi untuk Anda, dengan membungkus pernyataan Anda dalam sp_executesql, ketika Anda menggunakan CommandType.Text . Tetapi ketika Anda menggunakan CommandType.StoredProcedure Anda akan membuat parameter dan dengan demikian menyimpan database beberapa pekerjaan. Metode terakhir lebih cepat.

Sunting:

Penyiapan

Saya telah melakukan beberapa tes sendiri dan inilah hasilnya.

Buat prosedur ini:

create procedure dbo.Test
(
   @Text1 varchar(10) = 'Default1'
  ,@Text2 varchar(10) = 'Default2'
)
as
begin
   select @Text1 as Text1, @Text2 as Text2
end

Tambahkan jejak ke sana menggunakan SQL Server Profiler.

Dan kemudian panggil menggunakan kode berikut:

using System;
using System.Data;
using System.Data.SqlClient;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main()
        {
            CallProcedure( CommandType.Text );
            CallProcedure( CommandType.StoredProcedure );
        }

        private static void CallProcedure(CommandType commandType)
        {
            using ( SqlConnection connection = new SqlConnection("Data Source=localhost;Initial Catalog=Test;Integrated Security=SSPI;") )
            {
                connection.Open();
                using ( SqlCommand textCommand = new SqlCommand("dbo.Test", connection) )
                {
                    textCommand.CommandType = commandType;
                    textCommand.Parameters.AddWithValue("@Text1", "Text1");
                    textCommand.Parameters.AddWithValue("@Text2", "Text2");
                    using ( IDataReader reader = textCommand.ExecuteReader() )
                    {
                        while ( reader.Read() )
                        {
                            Console.WriteLine(reader["Text1"] + " " + reader["Text2"]);
                        }
                    }
                }
            }
        }
    }
}

Hasil

Dalam kedua kasus, panggilan dilakukan menggunakan RPC.

Inilah yang ditunjukkan oleh jejak menggunakan CommandType.Text :

exec sp_executesql N'dbo.Test',N'@Text1 nvarchar(5),@Text2 nvarchar(5)',@Text1=N'Text1',@Text2=N'Text2'

Dan inilah hasilnya menggunakan CommandType.StoredProcedure :

exec dbo.Test @Text1=N'Text1',@Text2=N'Text2'

Seperti yang Anda lihat, panggilan teks dibungkus dengan panggilan ke sp_executesql sehingga parameternya benar. Ini tentu saja akan membuat sedikit overhead, dan dengan demikian pernyataan saya sebelumnya yang menggunakan CommandType.StoredProcedure lebih cepat masih berdiri.

Hal penting lainnya, dan yang juga merupakan pemecah kesepakatan di sini, adalah ketika saya membuat prosedur tanpa nilai default, saya mendapatkan kesalahan berikut:

Msg 201, Level 16, State 4, Procedure Test, Line 0 Procedure orfunction 'Test' mengharapkan parameter '@Text1', yang tidak diberikan.

Alasan untuk ini adalah bagaimana panggilan ke sp_executesql dibuat, seperti yang Anda lihat parameter dideklarasikan dan diinisialisasi, tetapi tidak digunakan . Agar panggilan berfungsi, seharusnya terlihat seperti ini:

exec sp_executesql N'dbo.Test @Text1, @Text2',N'@Text1 nvarchar(5),@Text2 nvarchar(5)',@Text1=N'Text1',@Text2=N'Text2'

Artinya, saat Anda menggunakan CommandType.Text anda harus menambahkan parameter ke CommandText kecuali jika Anda selalu ingin nilai default digunakan.

Jadi, untuk menjawab pertanyaan Anda

  1. Menggunakan CommandType.StoredProcedure lebih cepat.
  2. Jika Anda menggunakan CommandType.Text , maka Anda harus menambahkan nama parameter ke panggilan ke prosedur kecuali jika Anda ingin nilai default digunakan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. EXP() Contoh di SQL Server

  2. Indeks Hilang SQL Server

  3. Masalah Replikasi Transaksional SQL Server

  4. Desain database:satu tabel besar atau tabel terpisah?

  5. SQL Server 2008 Data vertikal ke Horizontal