Отдельная процедура, необходимая для каждой функции CLR? - PullRequest
0 голосов
/ 01 марта 2012

Я просто немного поигрался с CLR-сборками на сервере SQL2008. Моей первой мыслью было: «Отлично, теперь мне не нужно добавлять 25 хранимых процедур и функций, чтобы сделать мою основную хранимую процедуру читабельной. Я просто создаю одну DLL и добавляю все, что мне нужно».

Итак, я только что попробовал простой пример HelloWorld из MSDN и в качестве примера, как его вызвать, я получаю:

CREATE PROCEDURE hello
AS
EXTERNAL NAME HelloWorld.Procedures.HelloWorld

Это единственный способ вызова функции в CLR-сборке? Я хочу вызывать его без создания единой хранимой процедуры для каждой функции в моем классе. Возможно ли это?

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Простой ответ, нет!Каждой хранимой процедуре и хранимой функции CLR требуется определение хранимой процедуры или хранимой функции с соответствующим внешним именем.

0 голосов
/ 16 августа 2015

Ну да и нет.Это зависит от того, что именно вы подразумеваете под «вызовом функции».

Если вы говорите с точки зрения вызова метода непосредственно из T-SQL, то да, каждый открытый метод нуждается в объекте-обертке T-SQL длядействовать как мост между ними (T-SQL и CLR).Эта интерпретация вопроса была сделана в ответе @ Mithrandir.

Однако, если вы говорите с точки зрения частных / внутренних методов в вашей сборке, то нет, им не нужны объекты-обертки T-SQL,Эта интерпретация основана на этом утверждении:

Моя первая мысль была: «Отлично, теперь мне не нужно добавлять 25 хранимых процедур и функций, чтобы сделать мои основные хранимые процедуры читабельными. Я просто создаю одинDLL и добавьте в него все, что мне нужно. "

Это утверждение подразумевает, что нужно иметь некоторые внутренние методы, которые вызываются открытыми методами, чтобы у вас не было так многовызовы загромождают основную процедуру.Открытые методы (т. Е. Методы с объектами-обертками T-SQL) могут совместно использовать служебные методы и даже могут ссылаться на другие сборки, если эти другие сборки:

  • в той же базе данных и
  • имеет того же авторизующего пользователя

Эти служебные методы могут по-прежнему осуществлять доступ к данным с помощью Context Connection, при условии, что они вызываются из методов, которые доступны для T-SQL (т.е. имеютатрибут SqlFunction, SqlProcedure и т. д. и соответствующий объект-оболочка T-SQL).

Вы даже можете создать сборку, которая не имеет открытых методов и содержит только код, на который ссылаются ваши другие сборки.В этом случае вы можете использовать ALTER ASSEMBLY , чтобы установить для свойства VISIBILITY значение OFF (это невозможно сделать с помощью CREATE ASSEMBLY).Если вы DROP сборка, которая ссылается на другую сборку, для которой VISIBILITY установлено значение OFF, то невидимая сборка будет автоматически удалена, как каскадное удаление с помощью внешнего ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...