Udostępnij za pośrednictwem


CLR wartość skalarna-Valued funkcje

funkcja skalarna (SVF) zwraca pojedynczej wartości, takie jak ciąg znaków, liczba całkowita lub wartości bitów.Zaczyna się od SQL Server 2005, wartości wartość skalarna funkcji zdefiniowanej przez użytkownika można tworzyć w dowolnym .NET Framework, języku programowania kod zarządzany. Funkcje te są dostępne dla Transact-SQL lub innego kod zarządzany. Aby uzyskać informacje na temat zalet integracja środowiska CLR i wybór między kod zarządzany i Transact-SQL, zobacz Omówienie integracja CLR.

Wymagania dotyczące środowiska CLR wartość skalarna Valued funkcje

.NET framework SVFs są implementowane jako metody dla klasy w zestawie .NET Framework.Parametry wejściowe i zwrócone przez SVF może być dowolnego typu danych wartość skalarna, obsługiwane przez SQL Server, z wyjątkiem varchar, char, rowversion, text, ntext, image, timestamp, table, lub cursor. SVFs musi zapewniać dopasowania między SQL Server Typ danych i typ zwracanych danych metoda wdrażania. Aby uzyskać więcej informacji na temat konwersji typu zobacz Mapowanie danych parametru CLR.

Podczas implementowania SVF Framework do .NET w języku systemu .NET Framework, SqlFunction Aby dołączyć dodatkowe informacje na temat funkcja można określić atrybut niestandardowego. The SqlFunction atrybut indicates whether or not the funkcja accesses or modifies data, if it is deterministic, and if the funkcja involves floating point operations.

Wartości wartość skalarna funkcji zdefiniowanej przez użytkownika mogą być deterministyczny lub innych niż deterministyczny.Deterministyczny funkcja zawsze zwraca ten sam wynik, gdy zostanie wywołana z określonego zestaw parametrów wejściowych.Funkcja deterministyczny może zwracać różne wyniki go jest wywoływana z określonego zestaw parametrów wejściowych.

Uwaga

Nie należy oznaczać funkcji jak deterministyczny Jeśli funkcja nie zawsze daje te same wartości wyjściowych, biorąc pod uwagę te same wartości wejściowych i tym samym stanie bazy danych.Oznakowanie funkcji jak deterministyczny, funkcja nie jest naprawdę deterministyczny mogą być przyczyną uszkodzenia Widoki indeksowane i kolumny obliczane.Znak funkcja jak deterministyczny ustawiając IsDeterministic właściwość na wartość true.

Tabela Valued parametry

Wycenione tabela parametrów (TVPs), typy zdefiniowane przez użytkownika tabela, które są przekazywane do procedury lub funkcja, zapewnia skuteczny sposób na przekazywanie wielu wierszy danych na serwerze.TVPs funkcjonalność podobnymi do tablic parametrów, ale oferują większą elastyczność i ściślejszej integracja z Transact-SQL. Zapewniają także możliwości, aby zapewnić lepszą wydajność.TVPs pomóc w ograniczeniu liczby round podróży do serwera.Zamiast wysyłać wiele żądań do serwera, na przykład z listą parametrów wartość skalarna, dane mogą być wysyłane do serwera jako TVP.Typ zdefiniowany przez użytkownika tabela nie mogą być przekazywane jako Wycenione tabela parametr, zwracane z zarządzanych procedura przechowywana lub funkcja w SQL Server proces. Aby uzyskać więcej informacji na temat TVPs zobacz Tabela Valued parametry (aparat bazy danych).

Przykład CLR funkcja wartość skalarna Valued

Poniżej przedstawiono prosty SVF, który uzyskuje dostęp do danych i zwraca wartość całkowitą:

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

public class T
{
    [SqlFunction(DataAccess = DataAccessKind.Read)]
    public static int ReturnOrderCount()
    {
        using (SqlConnection conn 
            = new SqlConnection("context connection=true"))
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand(
                "SELECT COUNT(*) AS 'Order Count' FROM SalesOrderHeader", conn);
            return (int)cmd.ExecuteScalar();
        }
    }
}
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlClient

Public Class T
    <SqlFunction(DataAccess:=DataAccessKind.Read)> _
    Public Shared Function ReturnOrderCount() As Integer
        Using conn As New SqlConnection("context connection=true")
            conn.Open()
            Dim cmd As New SqlCommand("SELECT COUNT(*) AS 'Order Count' FROM SalesOrderHeader", conn)
            Return CType(cmd.ExecuteScalar(), Integer)
        End Using
    End Function
End Class

W pierwszym wierszu kodu odwołania Microsoft.SqlServer.Server do atrybutów dostępu i System.Data.SqlClient Aby uzyskać dostęp do obszaru nazw ADO.NET. (Ten obszar nazw zawiera SqlClient, .NET Framework Data dostawca dla SQL Server.)

Następnie funkcja odbiera SqlFunction Atrybut niestandardowy, który znajduje się w Microsoft.SqlServer.Server obszar nazw. The custom attribute indicates whether or not the user-defined function (UDF) uses the in-process provider to read data in the server.SQL Server does not allow UDFs to update, insert, or delete data.SQL Server can optimize execution of a UDF that does not use the in-process provider.Jest to wskazywane przez ustawienie DataAccessKind Aby DataAccessKind.None. W następnym wierszu metodą docelową jest publiczne statyczne (udostępnione w programie Visual Basic .NET).

The SqlContext class, located in the Microsoft.SqlServer.Server namespace, can then access a SqlCommand object with a connection to the SQL Server wystąpienie that is already zestaw up. Chociaż nie używane w tym polu, bieżący kontekst transakcji jest również dostępna za pośrednictwem System.Transactions Interfejs programowania aplikacji (API).

Większość wiersze kodu w treści funkcja powinno wyglądać znanych dla deweloperów, którzy mają napisane aplikacje klienckie których używane są typy znalezionych w System.Data.SqlClient obszar nazw.

[C#]

using(SqlConnection conn = new SqlConnection("context connection=true")) 
{
   conn.Open();
   SqlCommand cmd = new SqlCommand(
        "SELECT COUNT(*) AS 'Order Count' FROM SalesOrderHeader", conn);
   return (int) cmd.ExecuteScalar();
}  

[Język Visual Basic]

Using conn As New SqlConnection("context connection=true")
   conn.Open()
   Dim cmd As New SqlCommand( _
        "SELECT COUNT(*) AS 'Order Count' FROM SalesOrderHeader", conn)
   Return CType(cmd.ExecuteScalar(), Integer)
End Using

Tekst odpowiednie polecenie jest określany przez inicjowanie SqlCommand obiekt. W poprzednim przykładzie zwraca liczbę wierszy w tabela SalesOrderHeader. Następny, ExecuteScalar Metoda cmd obiekt jest nazywany. Powoduje to zwrócenie wartości typu int na podstawie kwerendy. Na koniec liczba zamówienia są zwracane do obiektu wywołującego.

Jeśli kod ten jest zapisywany w pliku o nazwie FirstUdf.cs, go może zostać skompilowany w jako wirtualny plik dziennika w następujący sposób:

[C#]

csc.exe /t:library /out:FirstUdf.dll FirstUdf.cs 

[Język Visual Basic]

vbc.exe /t:library /out:FirstUdf.dll FirstUdf.vb

Uwaga

/t:Library wskazuje, czy powinny być produkowane w bibliotece, a nie plik wykonywalny.Pliki wykonywalne nie mogą być rejestrowane w SQL Server.

Uwaga

Obiekty bazy danych Visual C++ skompilowany z /clr:pure nie są obsługiwane przez wykonanie na SQL Server. Na przykład takie obiekty bazy danych zawierają wartości wartość skalarna funkcji.

The Transact-SQL query and a sample invocation to register the wirtualny plik dziennika and UDF are:

CREATE ASSEMBLY FirstUdf FROM 'FirstUdf.dll';
GO

CREATE FUNCTION CountSalesOrderHeader() RETURNS INT 
AS EXTERNAL NAME FirstUdf.T.ReturnOrderCount; 
GO

SELECT dbo.CountSalesOrderHeader();
GO

Należy zauważyć, że nazwa funkcja w działaniu w Transact-SQL nie musi odpowiadać nazwie statycznej metoda publiczne miejsce docelowe.

Uwaga

Beginnining z SQL Server 2005, na SQL ServerBaza danych o poziom zgodności „ 80"nie można tworzyć zarządzane typów zdefiniowanych przez użytkownika, procedura przechowywana, funkcje, zagregowanych lub wyzwalaczy. Aby korzystać z tych CLR funkcje integracja SQL Server, należy użyć sp_dbcmptlevel (języka Transact-SQL)procedura przechowywana, aby ustawić poziom zgodności bazy danych "100".