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
?
Remarque : Pourquoi T
? Cause Microsoft l'a fait.
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.