Nous portons une base de données SQL Server qui inclut un assembly CLR avec des fonctions de date (le développeur a disparu depuis longtemps). J'ai créé l'ensemble de la DLL (il est listé dans sys.assemblies):T-SQL ne trouve pas la fonction CLR dans l'assemblage - pas d'espace de noms?
CREATE ASSEMBLY ArkaDB FROM 'C:\Temp\ArkaDB.dll' WITH PERMISSION_SET = SAFE;
Mais lorsque je tente de créer une procédure stockée SQL pour la fonction GetOIDate:
create FUNCTION [dbo].[GetOIDate](@ActivityDate [datetime])
RETURNS [datetime] WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [ArkaDB].[ArkaDB.UserDefinedFunctions].[GetOIDate]
il donne l'erreur Msg 6505, niveau 16, état 2, procédure GetOIDate, ligne 2 Impossible de trouver le type 'ArkaDB.UserDefinedFunctions' dans l'assembly 'ArkaDB'. "
Vous pouvez voir la structure de la DLL ainsi que le code de la fonction dans la capture d'écran ILSpy ci-dessous. Notez le tiret "-" pour l'espace de noms. De this question, nous sommes censés inclure un espace de noms dans la spécification EXTERNAL NAME. Mais que faire s'il n'y a pas d'espace de noms? La réponse here indique que vous fournissez simplement la classe "EXTERNAL NAME [SqlClr] .Math. [Add]". J'ai essayé toutes les variantes que je peux penser et ils donnent tous la même chose pourrait-sans trouver erreur:
EXTERNAL NAME [ArkaDB].[ArkaDB.UserDefinedFunctions].[GetOIDate]
EXTERNAL NAME [ArkaDB].UserDefinedFunctions.[GetOIDate]
EXTERNAL NAME [ArkaDB].[.UserDefinedFunctions].[GetOIDate]
EXTERNAL NAME [ArkaDB].[-.UserDefinedFunctions].[GetOIDate]
EXTERNAL NAME [ArkaDB].[''.UserDefinedFunctions].[GetOIDate]
EXTERNAL NAME [ArkaDB].[ .UserDefinedFunctions].[GetOIDate]
Toutes les idées? Nous exécutons SQL Server 2012, tandis que la DLL a été initialement développée et installée en 2008 R2. ILSpy for ArkaDB DLL
Edit: pour srutzky ici est la définition de la classe publique dans ILSpy UserDefinedFunctions class
Celui - 'NOM EXTERNE [ArkaDB] .UserDefinedFunctions [GetOIDate]' - devrait être correct, ou vous pouvez ajouter des crochets autour du nom de la classe: 'NOM EXTERNE [ArkaDB] [. UserDefinedFunctions]. [GetOIDate] '. Cette classe est-elle marquée comme "publique"? –
Merci pour la réponse. Oui, la classe est publique - voir l'image ajoutée au message ci-dessus. Vous avez raison sur le format devrait-être-correct. Si je code la fonction SQL create dans l'ancienne base de données, elle génère "EXTERNAL NAME [ArkaDB]. [UserDefinedFunctions]. [GetOIDate]". Toutefois, cela donne une erreur similaire lors de l'exécution dans le nouveau serveur "Impossible de trouver le type 'UserDefinedFunctions' dans l'assembly 'ArkaDB'". Ma prochaine étape consiste à essayer de reconstruire la DLL dans Visual Studio, mais cela est toujours difficile pour le code existant: Ai-je la bonne source? Y a-t-il des problèmes de version VS? – user906802
Vos noms correspondent-ils à ceux des tables sys.assembl *? Comme décrit ici: https://docs.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql Recherche sur la page pour 'sys.' – shibormot