Вызовите функцию dll из хранимой процедуры sql, используя текущее соединение

Могу ли я вызвать dll из хранимой процедуры, используя открытое соединение?

У меня есть dll, которая получает данные с SQL Server, и я не хочу открывать новое соединение, когда вызываю его из хранимой процедуры.

Спасибо

Вот пример

public class Class1
{
    public static SqlString GetName(SqlString str)
    {
        SqlCommand cmd = new SqlCommand(str.ToString());
        cmd.CommandType = System.Data.CommandType.Text;

        string name = cmd.ExecuteScalar().ToString();
        return name;
    }
}

и это код SQL

CREATE FUNCTION fn_TestConnection
(
    @str nvarchar(255)
)
RETURNS nvarchar(max)
AS EXTERNAL NAME TestConnection.[TestConnection.Class1].GetName
GO

SELECT dbo.fn_TestConnection('SELECT FName FROM Clients WHERE Id = 1' )

person Menachem Erlanger    schedule 28.04.2015    source источник


Ответы (1)


Эти инструкции предназначены для Microsoft SQL Server Management Studio 2014.

Импорт сборки

Прежде всего, вам нужно импортировать эту сборку в базу данных в SQL Server Management Studio, перейдя в диалоговое окно «Новая сборка»:

Имя базы данных -> Программируемость -> Сборки -> (Щелкните правой кнопкой мыши) «Новая сборка...»

В диалоговом окне «Новая сборка» выберите Browse в поле Path to assembly и выберите сборку, которую хотите импортировать. Настройте разрешения и нажмите ok.

Обернуть методы сборки в функцию SQL

Затем вам нужно создать функцию sql, чтобы обернуть ваш метод сборки следующим образом:

CREATE FUNCTION [dbo].[fn_funcName](@str [varchar](max))
RETURNS 
   varchar(max) 
WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [YourSqlAssemblyName].[YourAssemblyName.Class1].[GetName]

Если вы хотите вернуть таблицу из своей функции, прочитайте о SqlFunctionAttribute в .NET.

person Gleb    schedule 28.04.2015
comment
Каково соглашение об именах ваших функций SQL, чтобы вы знали, из какой сборки они взяты? Или есть способ проверить в SQL Server Management Studio сборку, связанную с данной процедурой? - person Minh Tran; 12.10.2018
comment
@MinhTran Насколько я помню, нет соглашения об именах. Вы должны помнить об этом. Но теперь я уверен, что это было давным-давно. - person Gleb; 16.10.2018