Udostępnij za pośrednictwem


CLR wartości skalarnej funkcji

A funkcja skalarna (SVF) zwraca jedną wartość, takie jak ciąg znaków, liczba całkowita lub wartości bitów.Począwszy od SQL Server 2005, można utworzyć wartości wartość skalarna funkcji zdefiniowanej przez użytkownika w kod zarządzany przy użyciu dowolnej.NET Framework programowania języka.Funkcje te są dostępne dla Transact-SQL lub inny kod zarządzany.Informacje dotyczące zalet integracja CLR i wybór między kod zarządzany i Transact-SQL, zobacz Omówienie integracji CLR.

Wymagania dotyczące CLR wartości skalarnej funkcji

.NET Framework SVFs są implementowane jako metody klasy w.wirtualny plik dziennika .NET Framework.Parametry wejściowe i zwrócone przez SVF mogą 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 muszą zapewnić zgodność SQL Server Typ danych i typ zwracanych danych metoda implementacji.Aby uzyskać więcej informacji o konwersje typów, zobacz Mapowanie danych parametru CLR.

Podczas wdrażania.NET Framework SVF w.NET Framework języka SqlFunction można określić atrybut niestandardowego o dodatkowe informacje dotyczące funkcja.SqlFunction Atrybut wskazuje, czy funkcja uzyskuje dostęp do lub modyfikuje danych, jeśli jest deterministyczny, i jeśli funkcja obejmuje ruchomy punkt operacji.

Wartości skalarnej funkcji zdefiniowanej przez użytkownika może być deterministyczny lub deterministyczny.Przewidywalne funkcja zawsze zwraca ten sam wynik, gdy zostanie wywołana z określonego zestaw parametrów wejściowych.Firmy Deterministic Networks funkcja może zwracać różne wyniki jest wywoływana z określonego zestaw parametrów wejściowych.

Ostrzeżenie

Nie należy oznaczać funkcji jako deterministic Jeśli funkcja nie zawsze daje te same wartości wyjściowych tej samej wartości wejściowych i tym samym stanie bazy danych.Oznakowanie funkcji jako firmy Deterministic Networks, gdy funkcja nie jest naprawdę deterministic może spowodować uszkodzony Widoki indeksowane i kolumny obliczane.Oznacz funkcja jako deterministic ustawiając IsDeterministic Właściwość true.

Parametry oródwierszową

Oródwierszową parametry (TVPs), typy zdefiniowane przez użytkownika tabela, które są przekazywane do procedury lub funkcja, zapewniają skuteczny sposób przekazywania wielu wierszy danych do serwera.TVPs oferują podobne funkcje tablic parametrów, ale oferują większą elastyczność i ściślejszej integracja z Transact-SQL.Zapewniają także potencjału dla zwiększenia wydajności.TVPs także zmniejszyć liczbę przesłania do serwera.Zamiast wysyłać wiele żądań do serwera, takie jak lista parametrów wartość skalarna danych mogą być wysyłane do serwera jako TVP.Typ zdefiniowany przez użytkownika tabela nie przekazane jako parametr oródwierszową do zwracane z zarządzanych procedura składowana lub funkcja wykonywania w SQL Server procesu.Aby uzyskać więcej informacji o TVPs, zobacz Parametry oródwierszową (aparat bazy danych).

Przykład CLR wartości skalarnej funkcji

Oto proste 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

Pierwszy wiersz odwołania do kodu Microsoft.SqlServer.Server dostęp do atrybutów i System.Data.SqlClient do dostępu do obiektów ADO.NET namespace.(Zawiera ten obszar nazw SqlClient, the .NET Framework Data Provider dla SQL Server.)

Następnie funkcja odbiera SqlFunction atrybut niestandardowy, który znajduje się w Microsoft.SqlServer.Server obszaru 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 do DataAccessKind.None.W następnym wierszu miejsce docelowe metoda jest publiczne statyczne (udostępniony w języku Visual Basic.NET).

SqlContext Klasy znajduje się w Microsoft.SqlServer.Server obszaru nazw, może uzyskać dostęp SqlCommand obiekt z połączenia SQL Server instancji, która jest już zestaw up.Chociaż nie używane tutaj bieżący kontekst transakcji jest również dostępna za pośrednictwem System.Transactions interfejs programowania aplikacji (API).

Większość linii kodu w treści funkcja powinno wyglądać znanych programistom, którzy zostały zapisane klient aplikacje używające typów znalezionych w System.Data.SqlClient obszaru 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 polecenia właściwe jest określony przez inicjowanie SqlCommand obiektu.Poprzedni przykład zlicza wiersze w tabela SalesOrderHeader.Dalej, ExecuteScalar metoda cmd obiekt jest nazywany.Ta zwraca wartość typu int oparty na kwerendzie.Wreszcie zwracana jest liczba zamówień wywołującemu.

Jeśli ten kod jest zapisywany w pliku o nazwie FirstUdf.cs, to można kompilować do jako wirtualny plik dziennika następująco:

[C#]

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

[Język Visual Basic]

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

Ostrzeżenie

/t:library Wskazuje, powinny być produkowane biblioteki zamiast pliku wykonywalnego.Nie można zarejestrować pliki wykonywalne w SQL Server.

Ostrzeżenie

Obiekty bazy danych usługi 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.

Transact-SQL Kwerendy i wywołania próbki, aby zarejestrować wirtualny plik dziennika i UDF:

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, jak w Transact-SQL nie musi być zgodna z nazwą miejsce docelowe publicznej metoda statycznej.

Ostrzeżenie

Beginnining z SQL Server 2005, na SQL Server bazy danych z poziom zgodności "80" nie można utworzyć typy zarządzane przez użytkownika, procedura składowana, funkcje, agregatów ani wyzwalaczy. Aby skorzystać z tych funkcji integracja CLR z SQL Server, należy użyć sp_dbcmptlevel (języka Transact-SQL) przechowywane procedury zestaw poziom zgodności bazy danych "100".