clr depolanmış yordamlar
Saklı yordamları, skalar ifadeler kullanılamaz rutinleri vardır. Skalar işlevleri, onlar Sekmeli sonuçları ve iletileri istemciye veri tanımlama dili (ddl) ve veri düzenleme dili (dml) deyimleri çağırmak ve çıkış parametreleri geri dönebilirsiniz. clr tümleştirme ve yönetilen kod arasında seçim avantajları hakkında bilgi ve Transact-SQL, bakın clr tümleştirme genel bakış.
clr gereksinimleri depolanmış yordamlar
Ortak dil çalışma zamanı içinde (clr), saklı yordamlar bir sınıfta ortak statik yöntemleri olarak uygulanan bir Microsoft .NET FrameworkMeclis. Durağan bir yöntem ya da olarak geçersiz bildirilebilir veya bir tamsayı değer döndürür. Tamsayı değerini döndürür, döndürülen tamsayı yordam döndürülen kodu değerlendirilir. Örneğin:
EXECUTE @return\_status = procedure_name
@ Return_status değişken yöntemi tarafından döndürülen değeri içerir. Yöntemi geçersiz olarak bildirilirse, dönüş kodu 0'dır.
Yöntem parametreleri parametre alır, .NET Frameworkuygulama kullanılan parametre sayısı aynı olmalıdır Transact-SQLsaklı yordam bildirisi.
clr saklı yordama iletilen parametreleri herhangi bir yerli olabilir SQL Servereşdeğer olan türleri yönetilen kod. İçin Transact-SQLyordam oluşturmak için sözdizimi bu tür ile en uygun yerli belirtilmelidir SQL Servertürü equivalent. Tür dönüştürmeleri hakkında daha fazla bilgi için bkz: clr parametre verilerini eşleme.
Tablo Valued Parametreler
Tablo değerli parametreleri (TVPs), bir yordam veya işlev, geçirilen kullanıcı tanımlı tablo türleri, birden çok satır veri sunucusuna iletmek için etkili bir yol sağlar. TVPs parametre dizileri için benzer bir işlevsellik sağlar, ancak daha fazla esneklik ve daha yakın entegrasyon sunan Transact-SQL. Ayrıca potansiyel en iyi performansı sağlar. TVPs de tur gezileri sunucuya azaltılmasına yardımcı olur. Birden çok istek sunucuya göndermek yerine, gibi skalar parametreleri listesini içeren verileri sunucuya tvp gönderilebilir. Kullanıcı tanımlı tablo türü bir yönetilen saklı yordam, iade veya içinde yürütme fonksiyonu için tablo değerli bir parametre olarak geçirilemez SQL Serverişlem. TVPs hakkında daha fazla bilgi için bkz: Tablo Valued Parametreler (veritabanı altyapısı) kullanma.
clr sonuçları döndüren saklı yordamlar
Bilgi iade gelen .NET Frameworksaklı yordamlar çeşitli şekillerde. Bu çıkış parametreleri, Sekmeli sonuçları ve iletileri içerir.
ÇIKIŞ parametreleri ve clr depolanmış yordamlar
İle Transact-SQLgelen bilgiler döndürülebilir saklı yordamlar, .NET Frameworksaklı yordamlar çıkış parametreleri kullanma. Transact-SQLOluşturmak için kullanılan dml sözdizimi .NET Frameworksaklı yordamlar aynıdır yazılı saklı yordamları oluşturmak için kullanılan Transact-SQL. Uygulama kodunda ilgili parametre .NET Frameworksınıf geçmek tarafından başvuru parametresi bağımsız değişken olarak kullanmalıdır. Not Visual Basic, Visual C# yok aynı şekilde çıkış parametreleri desteklemez. Gönderimli parametresini belirlemek ve uygulamak gerekir <Out()> özniteliğini aşağıdaki de bir çıktı parametresi gösterir:
Imports System.Runtime.InteropServices
…
Public Shared Sub PriceSum ( <Out()> ByRef value As SqlInt32)
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 aşağıda gösterilmektedir:
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);
}
}
}
}
}
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
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
Sonra yukarıdaki clr içeren derleme depolanan yordamı yapılmış inşa ve created on the server, aşağıdaki Transact-SQLyordamı veritabanı oluşturmak için kullanılır ve belirtir sumoutput parametresi olarak.
CREATE PROCEDURE PriceSum (@sum int OUTPUT)
AS EXTERNAL NAME TestStoredProc.StoredProcedures.PriceSum
CREATE PROCEDURE PriceSum (@sum int OUTPUT)
AS EXTERNAL NAME TestStoredProc.StoredProcedures.PriceSum
Dikkat sumolarak bildirilmiş bir intSQL Server veri türü ve bu valuetanımlı clr saklı yordam parametre olarak belirtilen bir SqlInt32clr veri türü. clr depolanan yordamı çağıran bir program çalıştırıldığında SQL Serverotomatik olarak dönüştürür SqlInt32clr veri türü için bir int SQL Serververi türü. Hakkında hangi clr veri türleri ve dönüştürülemez daha fazla bilgi için bkz: clr parametre verilerini eşleme.
Sekmeli sonuçları ve iletileri döndürme
Sekmeli sonuçları ve iletileri istemciye dönen aracılığıyla yapılır SqlPipenesnesi kullanılarak elde edilen Pipeözelliği SqlContextsınıf SqlPipeNesnesinin bir Sendyöntemi. Çağırarak Sendyöntemini çağıran uygulama kanala üzerinden veri iletebilir.
Bunlar, birçok aşırı SqlPipe.Sendgönderir dahil yöntemi, bir SqlDataReaderve başka bir basit bir metin dizesi gönderir.
Geri dönen iletiler
Kullanım SqlPipe.Send(string)iletileri istemci uygulamasına göndermesine. İleti metni 8000 karakter ile sınırlıdır. İleti 8000 karakterden uzunsa kesilir.
Sekmeli sonuçları döndürülüyor
Bir sorgunun sonuçlarını doğrudan istemciye göndermek için aşırı birini kullanın Executeyöntemi SqlPipenesnesini. Bu verileri ağ arabellekleri için yönetilen belleğe kopyalanan olmadan transfer edilir çünkü sonuçları istemciye geri dönmek için en etkili yoludur. Ö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);
}
}
}
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
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
Sonuçları daha önce işlem sağlayıcı üzerinden yürütülen sorgu göndermek için (ya da özel bir uygulama kullanarak veri nu SqlDataReader), ve aşırı kullanmak Sendgötüren yöntemi bir SqlDataReader. Bu yöntem biraz daha önce açıklanan doğrudan yöntemi yavaştır ama istemciye gönderilmeden önce verileri işlemek için daha fazla esneklik sunuyor.
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);
}
}
}
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
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ümesi oluşturmak için doldurulacağı ve göndermek o-e doğru istemciye, 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);
}
}
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
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);
}
}
}
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
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 Sendikinci bir sekmeli sonuç kullanarak gönderirken istemciye bir ileti gönderir SqlDataReader.
Bu örnekler yalnızca açıklayıcı amaçlı olduğunu unutmayın. clr işlevler daha basit daha uygun Transact-SQLifadeleri hesaplama yoğun uygulamalar için. Neredeyse eşdeğer Transact-SQLsaklı yordam önceki örnek:
CREATE PROCEDURE HelloWorld() AS
BEGIN
PRINT('Hello world!')
SELECT ProductNumber FROM ProductMaster
END
CREATE PROCEDURE HelloWorld() AS
BEGIN
PRINT('Hello world!')
SELECT ProductNumber FROM ProductMaster
END
[!NOT]
İletileri ve sonuç kümeleri farklı istemci uygulamasında alınır. Örneğin, SQL Server Management Studiosonuç kümeleri görüntülenir sonuçları görünümü ve mesajları görünür mesaj bölmesi.
Eğer yukarıdaki Visual C# kodu MyFirstUdp.cs dosyasında kaydedilen ve ile derlenmiş:
csc /t:library /out:MyFirstUdp.dll MyFirstUdp.cs
csc /t:library /out:MyFirstUdp.dll MyFirstUdp.cs
Ya da, eğer yukarıdaki Visual Basic kodu MyFirstUdp.vb dosyasında kaydedilen ve ile derlenmiş:
vbc /t:library /out:MyFirstUdp.dll MyFirstUdp.vb
vbc /t:library /out:MyFirstUdp.dll MyFirstUdp.vb
[!NOT]
İle başlayan SQL Server 2005, derlenmiş Visual c++ veritabanı nesnelerinin (örneğin, saklı yordamlar) /clr:pureyürütülmesi için desteklenmiyor.
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
CREATE ASSEMBLY MyFirstUdp FROM 'C:\Programming\MyFirstUdp.dll'
CREATE PROCEDURE HelloWorld
AS EXTERNAL NAME MyFirstUdp.StoredProcedures.HelloWorld
EXEC HelloWorld
Ayrıca bkz.
Kavramlar
Database Compatibility Level Option