Aracılığıyla paylaş


clr saklı yordamları

Saklı yordamları, skaler deyimler içinde kullanılan yordamları olan.skaler fonksiyonları farklı olarak, bunlar sekmeli sonuçlar ve iletileri istemciye veri tanımı dili (ddl) çağırma döndürebilir ve veri işleme dili (dml) deyimi ve çıkış parametreleri dönün.clr tümleştirme ve yönetilen kod arasında seçim yararları hakkında bilgi ve Transact-SQL, bkz: clr tümleştirme genel bakış.

Saklı yordamları clr gereksinimleri

In the common language runtime (CLR), stored procedures are implemented as public static methods on a class in a Microsoft .NET Framework assembly.Durağan bir yöntem ya da hükümsüz olarak bildirilebilir veya bir tamsayı değer döndürür.Tamsayı değerini döndürür, döndürülen tamsayı yordamdan dönen kod kabul edilir.Örneğin:

EXECUTE @return_status = procedure_name

@ Return_status değişken yöntem tarafından döndürülen değeri içerir.Yöntem void bildirilirse, dönüş kodu 0'dır.

Yöntem parametreleri parametre alır, .NET Framework uygulaması içinde kullanılan parametreler numarası ile aynı olması gerekir Transact-SQL bildirim saklı yordam.

Geçilen parametreler için bir clr saklı yordam yerel olabilir SQL Server , yönetilen kod içinde bir eşdeğeri olan türleriİçin Transact-SQL yordam oluşturmak için sözdizimi bu türleri ile en uygun yerel belirtilmesi SQL Server türü eşdeğeri.Tür dönüştürmeleri hakkında daha fazla bilgi için bkz: clr parametre verilerini eşleme.

Tablo değerli parametreleri

Tablo değerli parametreleri (TVPs), bir yordam veya işlev, içine geçirilen kullanıcı tanımlı tablo türleri, birden çok veri satırı sunucusuna iletmek için etkili bir yöntem sağlar.TVPs parametre dizileri için benzer bir işlevsellik sağlar, ancak daha fazla esneklik ve daha yakın tümleştirme sunar Transact-SQL.Ayrıca olası en iyi performansı sağlarlar.TVPs durumsa sunucuya azaltılmasına da yardımcı olur.Birden çok istek sunucuya göndermek yerine, gibi skaler parametreleri listesini veri sunucusuna bir tvp gönderilebilir.Kullanıcı tanımlı tablo türü bir yönetilen saklı yordam, iade edilmesi veya işlev içinde yürütmek için tablo değerli bir parametre olarak geçirilemez SQL Server işlem.TVPs hakkında daha fazla bilgi için bkz: Tablo değerli Parametreler (veritabanı altyapısı).

clr sonuçları döndüren saklı yordamlar

Gelen bilgi döndürülmesi .NET Framework saklı yordamlar birkaç yolu.Bu çıkış parametreleri, sekmeli sonuçlar ve iletileri içerir.

Çıkış parametreleri ve clr saklı yordamları

Olduğu gibi Transact-SQL saklı yordamlar, bilgi döndürülmesi dan .NET Framework saklı yordamlar kullanarak çıkış parametreleri.The Transact-SQL DML syntax used for creating .NET Framework stored procedures is the same as that used for creating stored procedures written in Transact-SQL.Uygulama kodu içinde karşılık gelen parametrenin .NET Framework sınıf başvuru tarafından geçişi parametre olarak kullanması gerekenbağımsız değişken. Not Visual Basic, Visual C# yapan aynı şekilde çıkış parametreleri desteklemiyor.Başvuruya göre parametresini belirlemek ve uygulamak <Out()> öznitelik, aşağıdaki gibi bir çıktı parametresi temsil etmek için:

Imports System.Runtime.InteropServices
…
Public Shared Sub PriceSum ( <Out()> ByRef value As SqlInt32)

Bir çıkış parametresi aracılığıyla bilgi döndüren saklı yordam gösterir:

C#

using System;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server; 

public class StoredProcedures 
{
   [Microsoft.SqlServer.Server.SqlProcedure]
   public static void PriceSum(out SqlInt32 value)
   {
      using(SqlConnection connection = new SqlConnection("context connection=true")) 
      {
         value = 0;
         connection.Open();
         SqlCommand command = new SqlCommand("SELECT Price FROM Products", connection);
         SqlDataReader reader = command.ExecuteReader();
         
         using (reader)
         {
            while( reader.Read() )
            {
               value += reader.GetSqlInt32(0);
            }
         }         
      }
   }
}

Visual Basic

Imports System
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlClient
Imports System.Runtime.InteropServices

'The Partial modifier is only required on one class definition per project.
Partial Public Class StoredProcedures 
    ''' <summary>
    ''' Executes a query and iterates over the results to perform a summation.
    ''' </summary>
    <Microsoft.SqlServer.Server.SqlProcedure> _
    Public Shared Sub PriceSum( <Out()> ByRef value As SqlInt32)
        
        Using connection As New SqlConnection("context connection=true")
           value = 0
           Connection.Open()
           Dim command As New SqlCommand("SELECT Price FROM Products", connection)
           Dim reader As SqlDataReader
           reader = command.ExecuteReader()

           Using reader
              While reader.Read()
                 value += reader.GetSqlInt32(0)
              End While
           End Using
        End Using        
    End Sub
End Class

Bir kez yukarıdaki clr içeren derleme saklı yordam yerleşik olarak bulunan ve aşağıdaki sunucu üzerinde oluşturulan Transact-SQL veritabanında yordamı oluşturmak için kullanılır ve belirtir sum olarak bir çıkış parametresi.

CREATE PROCEDURE PriceSum (@sum int OUTPUT)
AS EXTERNAL NAME TestStoredProc.StoredProcedures.PriceSum

Dikkat sum olarak bildirilmiş bir int sql Server veri türü ve value clr içinde tanımlanan parametre saklı yordam olarak belirtilen bir SqlInt32 clr veri türü.When a calling program executes the CLR stored procedure, SQL Server automatically converts the SqlInt32 CLR data type to an int SQL Server data type.Hangi clr veri türleri olabilir ve hakkında dönüştürülemez daha fazla bilgi için bkz: clr parametre verilerini eşleme.

Sekmeli sonuçları ve iletileri döndüren

Sekmeli sonuçlar ve iletileri döndüren istemci yapılır SqlPipe kullanılarak elde nesnesi, Pipe özellik SqlContext WalkTreeThe SqlPipe object has a Send method.Çağırarak Send yöntem çağıran uygulama. kanala üzerinden veri aktarabilir

Bunlar çok sayıda aşırı yükleme, SqlPipe.Send yöntem gönderen biri de dahil olmak üzere, bir SqlDataReader diğeri yalnızca gönderen bir metin dize.

İletilerini döndüren

Use SqlPipe.Send(string) istemci uygulama ileti göndermek içinİleti metninin 8000 karakter ile sınırlıdır.İleti 8000 karakterden uzunsa, kesilecek.

Sekmeli sonuçları döndürülüyor

Göndermek için sonuçlar sorguyu doğrudan istemciye aşırı birini kullanın Execute yöntem SqlPipe nesne.Bu sonuçlar döndürmek için en etkili yoldur istemci, bu yana yönetilen belleğe kopyalanan verileri ağ arabellekleri aktarılır.Örneğin:

[C#]

using System;
using System.Data;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server; 

public class StoredProcedures 
{
   /// <summary>
   /// Execute a command and send the results to the client directly.
   /// </summary>
   [Microsoft.SqlServer.Server.SqlProcedure]
   public static void ExecuteToClient()
   {
   using(SqlConnection connection = new SqlConnection("context connection=true")) 
   {
      connection.Open();
      SqlCommand command = new SqlCommand("select @@version", connection);
      SqlContext.Pipe.ExecuteAndSend(command);
      }
   }
}

[Visual Basic]

Imports System
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlClient

'The Partial modifier is only required on one class definition per project.
Partial Public Class StoredProcedures 
    ''' <summary>
    ''' Execute a command and send the results to the client directly.
    ''' </summary>
    <Microsoft.SqlServer.Server.SqlProcedure> _
    Public Shared Sub ExecuteToClient()
        Using connection As New SqlConnection("context connection=true")
            connection.Open()
            Dim command As New SqlCommand("SELECT @@VERSION", connection)
            SqlContext.Pipe.ExecuteAndSend(command)
        End Using
    End Sub
End Class

Daha önce işlem sağlayıcı üzerinden yürütülen sorgu sonuçlar göndermek için (veya özel bir uygulaması kullanarak veri ön SqlDataReader), aşırı yüklenmesini kullanmak Send götüren yöntem bir SqlDataReader.Bu yöntem biraz daha önce açıklanan doğrudan bir yöntem yavaştır, ancak için göndermeden önce verileri işlemek için daha fazla esneklik sunan istemci.

using System;
using System.Data;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server; 

public class StoredProcedures 
{
   /// <summary>
   /// Execute a command and send the resulting reader to the client
   /// </summary>
   [Microsoft.SqlServer.Server.SqlProcedure]
   public static void SendReaderToClient()
   {
      using(SqlConnection connection = new SqlConnection("context connection=true")) 
      {
         connection.Open();
         SqlCommand command = new SqlCommand("select @@version", connection);
         SqlDataReader r = command.ExecuteReader();
         SqlContext.Pipe.Send(r);
      }
   }
}

[Visual Basic]

Imports System
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlClient

'The Partial modifier is only required on one class definition per project.
Partial Public Class StoredProcedures 
    ''' <summary>
    ''' Execute a command and send the results to the client directly.
    ''' </summary>
    <Microsoft.SqlServer.Server.SqlProcedure> _
    Public Shared Sub SendReaderToClient()
        Using connection As New SqlConnection("context connection=true")
            connection.Open()
            Dim command As New SqlCommand("SELECT @@VERSION", connection)
            Dim reader As SqlDataReader
            reader = command.ExecuteReader()
            SqlContext.Pipe.Send(reader)
        End Using
    End Sub
End Class

Dinamik sonuç küme oluşturmak, doldurmak ve kendisine göndermek için istemci, kayıtları geçerli bağlantı oluşturmak ve bunları göndermek kullanarak SqlPipe.Send.

using System.Data;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server; 
using System.Data.SqlTypes;

public class StoredProcedures 
{
   /// <summary>
   /// Create a result set on the fly and send it to the client.
   /// </summary>
   [Microsoft.SqlServer.Server.SqlProcedure]
   public static void SendTransientResultSet()
   {
      // Create a record object that represents an individual row, including it's metadata.
      SqlDataRecord record = new SqlDataRecord(new SqlMetaData("stringcol", SqlDbType.NVarChar, 128));
      
      // Populate the record.
      record.SetSqlString(0, "Hello World!");
      
      // Send the record to the client.
      SqlContext.Pipe.Send(record);
   }
}

[Visual Basic]

Imports System
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlClient

'The Partial modifier is only required on one class definition per project.
Partial Public Class StoredProcedures 
    ''' <summary>
    ''' Create a result set on the fly and send it to the client.
    ''' </summary>
    <Microsoft.SqlServer.Server.SqlProcedure> _
    Public Shared Sub SendTransientResultSet()
        ' Create a record object that represents an individual row, including it's metadata.
        Dim record As New SqlDataRecord(New SqlMetaData("stringcol", SqlDbType.NVarChar, 128) )

        ' Populate the record.
        record.SetSqlString(0, "Hello World!")

        ' Send the record to the client.
        SqlContext.Pipe.Send(record)        
    End Sub
End Class 

İşte bir örnek sekmeli sonuç ve üzerinden bir ileti gönderme SqlPipe.

using System.Data.SqlClient;
using Microsoft.SqlServer.Server; 

public class StoredProcedures 
{
   [Microsoft.SqlServer.Server.SqlProcedure]
   public static void HelloWorld()
   {
      SqlContext.Pipe.Send("Hello world! It's now " + System.DateTime.Now.ToString()+"\n");
      using(SqlConnection connection = new SqlConnection("context connection=true")) 
      {
         connection.Open();
         SqlCommand command = new SqlCommand("SELECT ProductNumber FROM ProductMaster", connection);
         SqlDataReader reader = command.ExecuteReader();
         SqlContext.Pipe.Send(reader);
      }
   }
}

[Visual Basic]

Imports System
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlClient

'The Partial modifier is only required on one class definition per project.
Partial Public Class StoredProcedures 
    ''' <summary>
    ''' Execute a command and send the results to the client directly.
    ''' </summary>
    <Microsoft.SqlServer.Server.SqlProcedure> _
    Public Shared Sub HelloWorld()
        SqlContext.Pipe.Send("Hello world! It's now " & System.DateTime.Now.ToString() & "\n")
        Using connection As New SqlConnection("context connection=true")
            connection.Open()
            Dim command As New SqlCommand("SELECT ProductNumber FROM ProductMaster", connection)
            Dim reader As SqlDataReader
            reader = command.ExecuteReader()
            SqlContext.Pipe.Send(reader)
        End Using
    End Sub
End Class 

İlk Send için bir ileti gönderir istemci, ikinci bir sekmeli sonuç kullanarak gönderirken SqlDataReader.

Bu örnekler amaçlarla yalnızca olduğunu unutmayın.clr işlevler daha basit daha uygun Transact-SQL ifadeleri hesaplama yoğun uygulamaları.Neredeyse eşdeğer Transact-SQL saklı yordam için önceki örnek:

CREATE PROCEDURE HelloWorld() AS
BEGIN
PRINT('Hello world!')
SELECT ProductNumber FROM ProductMaster
END

Not

İletileri ve sonuç kümelerini istemci uygulamasında farklı alınır.İçin örnek, SQL Server Management Studio sonuç kümeleri görüntülenir sonuçları görünümü ve iletileri görüntülenir iletileri bölmesi.

Yukarıdaki Visual C# kodu MyFirstUdp.cs dosyasında kaydedilen ve ile derlenmiş içeriyorsa:

csc /t:library /out:MyFirstUdp.dll MyFirstUdp.cs 

Veya, yukarıdaki Visual Basic kodu MyFirstUdp.vb dosyasında kaydedilen ve ile derlenmiş:

vbc /t:library /out:MyFirstUdp.dll MyFirstUdp.vb 

Not

İle başlayan SQL Server 2005, Visual c++ veritabanı nesnelerinin (örneğin, saklı yordamlar) ile derlenmiş /clr:pure yürütme için desteklenmez

Oluşturulan derleme kayıtlı ve giriş noktası çağrılan aşağıdaki ddl ile:

CREATE ASSEMBLY MyFirstUdp FROM 'C:\Programming\MyFirstUdp.dll'
CREATE PROCEDURE HelloWorld
AS EXTERNAL NAME MyFirstUdp.StoredProcedures.HelloWorld
EXEC HelloWorld

Not

İle başlayan SQL Server 2005, bir SQL Server veritabanı uyumluluk düzey "80" Yönetilen kullanıcı tanımlı türleri, saklı yordamları, işlevleri, toplamları veya Tetikleyiciler oluşturamazsınız. Bu clr tümleştirme özelliklerinden yararlanmak için SQL Server, kullanmanız gereken sp_dbcmptlevel saklı yordam için küme "100" için veritabanını uyumluluk düzeyini.