web-dev-qa-db-fra.com

SQL Server: Impossible de trouver le type dans l'assemblage

Supposons que la DLL de l'assemblage:

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

namespace CLRFunctions
{
    public class T
    {
        [SqlFunction(DataAccess = DataAccessKind.Read)]
        public static String NormalizeString(String s, String normalizationForm)
        {
            NormalizationForm form = NormalizationForm.FormC;

            if (String.Equals(f, "FormD", StringComparison.OrdinalIgnoreCase))
                form = NormalizationForm.FormD;

            return = s.Normalize(form);
        }
    }
}

Remarque : cible l'assemblage sur .NET 3.5 en tant que serveur SQL ne prend pas en charge .NET 4.0

Copiez l'assemblage sur un emplacement et "Créer" L'assembly fonctionne bien:

CREATE Assembly CLRFunctions FROM 'c:\Program Files\My App\CLRFunctions.dll';

Remarque: puis activer les fonctions CLR, sinon elles sont cassépar == = Par défaut :

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO

Créé la fonction définie par l'utilisateur échoue:

CREATE FUNCTION NormalizeString(@s nvarchar(max), @normalizationForm varchar(50)) 
RETURNS nvarchar(max)
AS EXTERNAL NAME CLRFunctions.T.NormalizeString

échoue avec erreur:

Msg 6505, Level 16, State 2, Procedure NormalizeString, Line 1
Could not find Type 'T' in Assembly 'CLRFunctions'.

Pourquoi SQL Server peut-il trouver le type T in montage CLRFunctions?

enter image description here

Remarque : Pourquoi T? Cause Microsoft l'a fait.

38
Ian Boyd

Je viens d'éclairer mon crâne à ce sujet dans Visual Studio 2017, construisant un CLR dans VB. Ce que j'ai découvert, lors de la création de la procédure dans SQL, le nom externe est défini comme suit:

  • AssemblyName.[Assemblyname.ClassNameInVBProgram].SubroutineNameInVBProgram

Et c'est sensible à la casse.

Utilisation Create Assembly dans SQL pour créer l'assemblage SQL

Utilisation Create Procedure dans SQL pour créer le CLR SP.

2
Sonny