Мы портируем базу данных SQL Server, которая включает сборку CLR с функциями даты (разработчик давно ушел). Я создал сборку из DLL (она указана в sys.assemblies):
CREATE ASSEMBLY ArkaDB FROM 'C:\Temp\ArkaDB.dll' WITH PERMISSION_SET = SAFE;
Но когда я пытаюсь создать хранимую процедуру SQL для функции GetOIDate:
create FUNCTION [dbo].[GetOIDate](@ActivityDate [datetime])
RETURNS [datetime] WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [ArkaDB].[ArkaDB.UserDefinedFunctions].[GetOIDate]
выдает ошибку «Сообщение 6505, уровень 16, состояние 2, процедура GetOIDate, строка 2. Не удалось найти тип ArkaDB.UserDefinedFunctions в сборке ArkaDB».
Вы можете увидеть структуру DLL вместе с кодом функции на снимке экрана ILSpy ниже. Обратите внимание на дефис "-" для пространства имен. Из этого вопроса мы должны включить пространство имен в спецификацию EXTERNAL NAME. Но что, если нет пространства имен? Ответ здесь указывает, что вы просто предоставляете класс, например "ВНЕШНЕЕ ИМЯ [ SqlClr].Math.[Добавить]". Я пробовал все возможные варианты, и все они дают одну и ту же ошибку «не удалось найти»:
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]
Любые идеи? Мы используем SQL Server 2012, а DLL изначально была разработана и установлена в 2008 R2. ILSpy для ArkaDB DLL
Изменить: для srutzky вот определение общедоступного класса в классе ILSpy UserDefinedFunctions
EXTERNAL NAME [ArkaDB].UserDefinedFunctions.[GetOIDate]
-- должно быть правильным, или вы можете добавить квадратные скобки вокруг имени класса:EXTERNAL NAME [ArkaDB].[UserDefinedFunctions].[GetOIDate]
. Этот класс помечен как общедоступный? - person Solomon Rutzky   schedule 21.06.2017sys.
- person shibormot   schedule 22.06.2017DATETIME2
вместоDATETIME
для типов входных параметров и возвращаемых значений? - person Solomon Rutzky   schedule 22.06.2017content
, используя следующий запрос:SELECT DATALENGTH([content]) AS [bytes], * FROM sys.assembly_files WHERE [name] LIKE N'%ArkaDB%' AND [file_id] = 1;
. Если они имеют одинаковое количество байтов, вам необходимо сравнить содержимое. Вы можете скопировать и вставить значения содержимого с обоих серверов в запрос, где вы создадите их как переменныеVARBINARY(MAX)
илиVARCHAR(MAX)
и посмотрите, равны ли они. - person Solomon Rutzky   schedule 22.06.2017