복붙노트

[SQL] 저장 프로 시저를 실행할 때, CommandType.Text를 사용하여 대 CommandType.StoredProcedure를 사용의 이점은 무엇인가?

SQL

저장 프로 시저를 실행할 때, CommandType.Text를 사용하여 대 CommandType.StoredProcedure를 사용의 이점은 무엇인가?

그래서 C #에서 나는 다음 (생략 연결 코드)와 같은 코드가 저장 프로 시저를 사용합니다 :

 string sql = "GetClientDefaults";

 SqlCommand cmd = new SqlCommand(sql);
 cmd.CommandType = CommandType.StoredProcedure;    //<-- DO I NEED THIS??
 cmd.Parameters.AddWithValue("@computerName", computerName);

어디 SQL 저장 프로 시저의 이름입니다. 자,이 코드와 주석 라인없이 잘 작동하는 것 같다.

그래서,이 줄을해야합니까? 이 설정에 약간의 성능 (또는 다른) 혜택이 있습니까? 를 설정하거나 텍스트로 설정하지 않는 이점이 있습니까?

해결법

  1. ==============================

    1.당신이 CommandType.Text를 사용하는 SQL 서버가 sp_executesql을에 문을 감싸서, 당신을 위해 매개 변수화 할 것입니다이 블로그 게시물의 테스트에 따르면. 당신이 CommandType.StoredProcedure를 사용할 때 당신은 그것을 매개 변수화하여 데이터베이스 몇 가지 작업을 저장합니다. 후자의 방법은 빠르다.

    당신이 CommandType.Text를 사용하는 SQL 서버가 sp_executesql을에 문을 감싸서, 당신을 위해 매개 변수화 할 것입니다이 블로그 게시물의 테스트에 따르면. 당신이 CommandType.StoredProcedure를 사용할 때 당신은 그것을 매개 변수화하여 데이터베이스 몇 가지 작업을 저장합니다. 후자의 방법은 빠르다.

    편집하다:

    설정

    나는 몇 가지 검사에게 자신을 한 적이 여기 결과입니다.

    이 절차를 만듭니다

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

    SQL Server 프로파일 러를 사용에 대한 추적을 추가합니다.

    그리고 다음 코드를 사용하여 전화 :

    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"]);
                            }
                        }
                    }
                }
            }
        }
    }
    

    결과

    두 경우 모두 호출은 RPC를 사용하여 만들어집니다.

    여기에 추적이 사용 CommandType.Text을 알 수있는 작업은 다음과 같습니다

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

    그리고 여기 CommandType.StoredProcedure를 사용하여 결과는 다음과 같습니다

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

    당신은 제대로 파라미터 화 될 수 있도록 텍스트 호출을 sp_executesql에 대한 호출에 싸여 볼 수 있듯이. CommandType.StoredProcedure를 사용하여 서 빠른 여전히 것을 물론이 뜻을 따라서 내 이전 문을 약간의 오버 헤드를 생성합니다.

    여기에 계약 위반의 종류도 또 다른 주목할만한 것은, 그리고, 나는 기본값없이 절차를 만들 때 다음과 같은 오류를 가지고 있다는 것입니다 :

    그 이유는 sp_executesql을 호출이 당신이 매개 변수를 선언하고 초기화 볼 수 있듯이, 생성,하지만 사용하지 않는 방법이다. 작업에 대한 호출 들어, 다음과 같이 봤어야 :

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

    당신이 CommandType.Text을 사용할 때 의미, 당신은 당신이 항상 기본 값을 사용하지 않으려면의 CommandText에 매개 변수를 추가해야합니다.

    따라서, 귀하의 질문에 대답하기

  2. ==============================

    2.큰 차이는 실제로 있습니다. 명령 유형의 StoredProcedure를 지정하는 경우 다음 당신은 당신의하는 SqlCommand에 추가하는 매개 변수는 매개 변수는 프로 시저 호출을 추가 할 것이다. 당신이 텍스트로두면 다음 매개 변수가없는 절차에 배치에 추가됩니다. 점을 설명하기 위해 더미 절차를 만들 수 있습니다 :

    큰 차이는 실제로 있습니다. 명령 유형의 StoredProcedure를 지정하는 경우 다음 당신은 당신의하는 SqlCommand에 추가하는 매개 변수는 매개 변수는 프로 시저 호출을 추가 할 것이다. 당신이 텍스트로두면 다음 매개 변수가없는 절차에 배치에 추가됩니다. 점을 설명하기 위해 더미 절차를 만들 수 있습니다 :

    create procedure usp_test 
        @p1 char(10)  = 'foo',
        @p2 int = 42
    as
        select @p1, @p2;    
    go
    

    그런 다음이 작은 C # 응용 프로그램을 컴파일 :

       static void Main(string[] args)
        {
            ExecWithType(CommandType.Text);
            ExecWithType(CommandType.StoredProcedure);
        }
    
        static void ExecWithType(CommandType type)
        {
            using (SqlConnection conn = new SqlConnection(Settings.Default.connString))
            {
                conn.Open();
                using (SqlCommand cmd1 = new SqlCommand("usp_test", conn))
                {
                    cmd1.CommandType = type;
                    cmd1.Parameters.AddWithValue("@p1", "bar");
                    cmd1.Parameters.AddWithValue("@p2", 24);
                    using (SqlDataReader rdr = cmd1.ExecuteReader())
                    {
                        while (rdr.Read())
                        {
                            Console.WriteLine("Type: {0} Result: @p1: {1} @p2: {2}", type, rdr[0], rdr[1]);
                        }
                    }
                }
            }
        }
    

    결과는 다음과 같습니다

    Type: Text Result: @p1: foo        @p2: 42
    Type: StoredProcedure Result: @p1: bar        @p2: 24
    

    아야! 매개 변수가 배치에 전달 된 있지만 CommandType.Text 설정의 경우, 그들은 프로 시저로 전달되지 않았다. 재미를 디버깅 많은 시간 소스 ...

  3. ==============================

    3.당신은이 ADO.NET은 당신을 도울 수 있도록 설정합니다. 당신이 CommandType.StoredProcedure를 사용하면 저장 프로 시저의 이름을 동일 단지 넣어의 CommandText해야합니다.

    당신은이 ADO.NET은 당신을 도울 수 있도록 설정합니다. 당신이 CommandType.StoredProcedure를 사용하면 저장 프로 시저의 이름을 동일 단지 넣어의 CommandText해야합니다.

    예를 들어,이 :

    YourSqlCommand.CommandType = CommandType.StoredProcedure;
    YourSqlCommand.CommandText = "dbo.YourStoredProc";
    

    상당에인가 :

    YourSqlCommand.CommandText = "exec dbo.YourStoredProc";
    
  4. ==============================

    4.CommandType을은 SQL 서버에 특정하지 않습니다. 그것은 특정의 방법으로의 CommandText을 치료하는 내부 공급자를 지시에 IDbCommand 인터페이스의 속성입니다. SQL 서버는 절차대로 한 단어로 이름을 치료할 수 있지만, 당신이 다른 업체에서 일을 기 대해서는 안된다.

    CommandType을은 SQL 서버에 특정하지 않습니다. 그것은 특정의 방법으로의 CommandText을 치료하는 내부 공급자를 지시에 IDbCommand 인터페이스의 속성입니다. SQL 서버는 절차대로 한 단어로 이름을 치료할 수 있지만, 당신이 다른 업체에서 일을 기 대해서는 안된다.

    일반적으로, 당신은 SqlCommand를 같은 특정 클래스 대신 DbCommand 같은 공급자가 생성 한 클래스를 사용하는 것을 선호한다. 이 방법 당신은 단순히 설정 파일에서 공급자 문자열을 변경하여 다른 데이터베이스를 타겟팅 할 수 있습니다.

  5. from https://stackoverflow.com/questions/9267078/when-executing-a-stored-procedure-what-is-the-benefit-of-using-commandtype-stor by cc-by-sa and MIT license