2017-06-20 3 views
1

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

+0

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"? –

+0

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

+0

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

Répondre

0

Malheureusement, je ne peux pas commenter (pas assez réputation), donc nous, s essayer une réponse à la place:

Vous avez écrit: " Si je code la fonction SQL create dans l'ancienne base de données, elle génère "EXTERNAL NAME [ArkaDB]. [UserDefinedFunctions]. [GetOIDate]". ". Que faire si vous script de l'assembly à partir de l'ancienne base de données (où cela fonctionne, je suppose), et déployer dans la nouvelle base de données de cette façon.

Quelque chose comme:

CREATE ASSEMBLY ArkaDB FROM binary_representation WITH PERMISSION_SET = SAFE; 

De cette façon, vous devriez au moins être en mesure de l'obtenir déployé. Si aucun espace de nom existe, dans votre assemblée, la fonction créer devrait être comme srutzky dit:

CREATE FUNCTION [dbo].[GetOIDate](@ActivityDate [datetime]) 
RETURNS [datetime] WITH EXECUTE AS CALLER 
EXTERNAL NAME [ArkaDB].[UserDefinedFunctions].[GetOIDate] 

faites-nous savoir s'il vous plaît comment ça se passe. .

Niels