Partager via


Comment : créer et exécuter un type défini par l'utilisateur SQL Server à l'aide de l'intégration du Common Language Runtime

Créez un type SQL défini par l'utilisateur en ajoutant un Type défini par l'utilisateur à un projet de base de données Common Language Runtime SQL Server (CLR SQL). Une fois le déploiement réussi, vous pouvez l'utiliser dans tous les contextes dans lesquels vous pouvez utiliser un type de système. Cela inclut les définitions de colonne, les variables, les paramètres, les résultats de fonction, les curseurs, les déclencheurs et la réplication. Les types définis par l'utilisateur permettent à celui-ci d'étendre le système de type de données SQL Server, ainsi que de définir des types structurés complexes.

Notes

Il est possible que votre ordinateur affiche des noms ou des emplacements différents pour certains des éléments d'interface utilisateur de Visual Studio dans les instructions suivantes. L'édition de Visual Studio dont vous disposez et les paramètres que vous utilisez déterminent ces éléments. Pour plus d'informations, consultez Paramètres Visual Studio.

Création d'un type défini par l'utilisateur

Pour créer un type défini par l'utilisateur SQL

  1. Ouvrez un Projet de base de données CLR SQL existant ou créez-en un. Pour plus d'informations, consultez Comment : créer un projet pour des objets de base de données qui utilisent l'intégration du Common Language Runtime SQL Server.

  2. Dans le menu Projet, cliquez sur Ajouter un nouvel élément.

  3. Dans la boîte de dialogue Ajouter un nouvel élément , sélectionnez Type défini par l'utilisateur.

  4. Tapez un Nom pour le nouveau type défini par l'utilisateur.

  5. Ajoutez le code pour définir et créer le type défini par l'utilisateur. Consultez le premier exemple qui suit cette procédure.

  6. Dans l'Explorateur de solutions, ouvrez le dossier TestScripts et double-cliquez sur le fichier Test.sql.

    Notes

    Vous pouvez spécifier d'autres scripts comme script de débogage par défaut. Pour plus d'informations, consultez Comment : modifier le script Test.sql pour exécuter des objets qui utilisent l'intégration du Common Language Runtime SQL Server.

  7. Ajoutez au fichier Test.sql (debug.sql en Visual C++) le code permettant d'exécuter le type défini par l'utilisateur. Consultez le deuxième exemple qui suit cette procédure.

  8. Appuyez sur F5 pour générer, déployer et déboguer le type défini par l'utilisateur. Pour plus d'informations sur le déploiement sans débogage, consultez Comment : déployer des éléments de projet de base de données CLR SQL sur un serveur SQL Server.

    Important

    SQL Server 2005 et SQL Server 2008 prennent uniquement en charge les projets SQL Server générés avec la version 2.0, 3.0 ou 3.5 de .NET Framework. Si vous essayezSQL Server de déployer un projet versSQL Server 2005 ouSQL Server 2008, une erreur s'affiche : Deploy error (SQL01268): .NET SqlClient Data Provider: Msg 6218, Level 16, State 3, Line 1 CREATE ASSEMBLY for assembly 'AssemblyName' failed because assembly 'AssemblyName' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database (où AssemblyName est le nom de l'assembly que vous déployez). Pour plus d'informations, consultez Comment : créer un projet pour des objets de base de données qui utilisent l'intégration du Common Language Runtime SQL Server.

  9. Affichez les résultats affichés dans etSortie, fenêtre entrez la sortie de spectacle de : Sortie de base de données.

Exemple

Cet exemple crée un type Point que vous pouvez utiliser comme s'il s'agissait de tout autre type simple. La déclaration de classe est décorée à la fois avec Serializable et avec les attributs SqlUserDefinedTypeAttribute. La propriété Format de SqlUserDefinedTypeAttribute détermine le format de stockage du type défini par l'utilisateur. Le type implémente la conversion de chaînes à l'aide des méthodes Parse et ToString. Il implémente également deux procédures de propriété afin d'obtenir et de définir les valeurs de X et Y pour le point représenté par cette classe.

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

<Serializable()>
<SqlUserDefinedType(Format.Native)>
Public Structure Point
    Implements INullable

    Private m_x As Int32
    Private m_y As Int32
    Private is_Null As Boolean


    Public Property X() As Int32
        Get
            Return (Me.m_x)
        End Get
        Set(ByVal Value As Int32)
            m_x = Value
        End Set
    End Property


    Public Property Y() As Int32
        Get
            Return (Me.m_y)
        End Get
        Set(ByVal Value As Int32)
            m_y = Value
        End Set
    End Property


    Public ReadOnly Property IsNull() As Boolean Implements INullable.IsNull
        Get
            Return is_Null
        End Get
    End Property


    Public Shared ReadOnly Property Null() As Point
        Get
            Dim pt As Point = New Point
            pt.is_Null = True
            Return pt
        End Get
    End Property


    Public Overrides Function ToString() As String
        If Me.IsNull() Then
            Return Nothing
        Else
            Return Me.m_x & ":" & Me.m_y
        End If
    End Function


    Public Shared Function Parse(ByVal s As SqlString) As Point
        If s = SqlString.Null Then
            Return Null
        End If

        If s.ToString() = SqlString.Null.ToString() Then
            Return Null
        End If

        If s.IsNull Then
            Return Null
        End If

        'Parse input string here to separate out coordinates
        Dim str As String = Convert.ToString(s)
        Dim xy() As String = str.Split(":"c)

        Dim pt As New Point()
        pt.X = CType(xy(0), Int32)
        pt.Y = CType(xy(1), Int32)
        Return (pt)
    End Function


    Public Function Quadrant() As SqlString

        If m_x = 0 And m_y = 0 Then
            Return "centered"
        End If

        Dim stringResult As String = ""

        Select Case m_x
            Case 0
                stringResult = "center"
            Case Is > 0
                stringResult = "right"
            Case Is < 0
                stringResult = "left"
        End Select

        Select Case m_y
            Case 0
                stringResult = stringResult & " center"
            Case Is > 0
                stringResult = stringResult & " top"
            Case Is < 0
                stringResult = stringResult & " bottom"
        End Select

        Return stringResult
    End Function
End Structure
using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

[Serializable()]
[SqlUserDefinedType(Format.Native)]
public struct Point : INullable
{
    private Int32 m_x;
    private Int32 m_y;
    private bool is_Null;


    public Int32 X
    {
        get
        {
            return (this.m_x);
        }
        set
        {
            m_x = value;
        }
    }


    public Int32 Y
    {
        get
        {
            return (this.m_y);
        }
        set
        {
            m_y = value;
        }
    }


    public bool IsNull
    {
        get
        {
            return is_Null;
        }
    }


    public static Point Null
    {
        get
        {
            Point pt = new Point();
            pt.is_Null = true;
            return (pt);
        }
    }


    public override string ToString()
    {
        if (this.IsNull)
        {
            return "NULL";
        }
        else
        {
            return this.m_x + ":" + this.m_y;
        }
    }


    public static Point Parse(SqlString s)
    {
        if (s.IsNull)
        {
            return Null;
        }

        // Parse input string here to separate out coordinates
        string str = Convert.ToString(s);
        string[] xy = str.Split(':');

        Point pt = new Point();
        pt.X = Convert.ToInt32(xy[0]);
        pt.Y = Convert.ToInt32(xy[1]);
        return (pt);
    }


    public SqlString Quadrant()
    {
        if (m_x == 0 && m_y == 0)
        {
            return "centered";
        } 

        SqlString stringReturn = "";

        if (m_x == 0)
        {
            stringReturn = "center";
        }
        else if (m_x > 0)
        {
            stringReturn = "right";
        } 
        else if (m_x < 0)
        {
            stringReturn = "left";
        }

        if (m_y == 0) 
        {
            stringReturn = stringReturn + " center";
        }
        else if (m_y > 0)
        {
            stringReturn = stringReturn + " top";
        }
        else if (m_y < 0)
        {
            stringReturn = stringReturn + " bottom";
        }

        return stringReturn;
    }
}

Ajoutez le code pour exécuter et tester votre type défini par l'utilisateur (Point) au fichier Test.sql dans le dossier Scripts de test de votre projet. Par exemple, pour vérifier le nouveau type, créez une table qui l'utilise. L'exemple suivant illustre l'utilisation du type Point lors de la création de la table.

CREATE TABLE test_table (column1 Point)
go

INSERT INTO test_table (column1) VALUES ('1:2')
INSERT INTO test_table (column1) VALUES ('-2:3')
INSERT INTO test_table (column1) VALUES ('-3:-4')

select column1.Quadrant() from test_table

Voir aussi

Tâches

Comment : créer un projet pour des objets de base de données qui utilisent l'intégration du Common Language Runtime SQL Server

Comment : créer et exécuter une procédure stockée SQL Server à l'aide de l'intégration du Common Language Runtime

Comment : créer et exécuter un déclencheur SQL Server à l'aide de l'intégration du Common Language Runtime

Comment : créer et exécuter un agrégat SQL Server à l'aide de l'intégration du Common Language Runtime

Comment : créer et exécuter une fonction définie par l'utilisateur SQL Server à l'aide de l'intégration du Common Language Runtime

Procédure pas à pas : création d'une procédure stockée dans le code managé

Comment : déboguer une procédure stockée SQL CLR

Référence

Attributs pour les projets de base de données CLR SQL et les objets de base de données

Concepts

Présentation de l'intégration de CLR dans SQL Server (ADO.NET)

Avantages de l'utilisation de code managé pour créer des objets de base de données

Démarrage du développement en équipe de bases de données faisant référence à des objets SQLCLR

Création d'objets SQL Server dans du code managé

Autres ressources

SQL CLR Database Debugging