Сборка CLR C # внутри SQL Server - PullRequest
7 голосов
/ 16 июня 2011
  • Можно ли сделать большой проект на C # (много функций), тогда
  • Создайте для него сборку CLR, затем
  • В SQL Server IN STORED PROC, вызовите функцию, которая находится в сборке,
  • Таблица (которую я передам в ASSEMBLY) вычисляется в других хранимых процессах ...

    • Если это так, каковы были бы шаги?

Я думаю, что-то вроде этого.

-- I have a stored proc that gets a table, let it be myStoredProcTable

--FIST ENABLE DATA ACCESS
EXEC sp_serveroption 'TheServerName', 'DATA ACCESS', TRUE

--main.sql calls yStoredProcTable.sql and the calls functionAssembly
SELECT  *
INTO    #tmpTable
FROM    OPENQUERY(SERVERNAME, 'EXEC test.dbo.myStoredProcTable 1')


-- pass the table to assembly
-- how would i pass the table to assembly code?, Is this POSSIBLE?
    EXEC functionAssembly #tmpTable

------------------------------------------ редактировать

После @faester ответа: - Как я мог использовать XML в коде, я предложил использовать numberTOstring, но я думаю, что вариант XML здесь самый лучший ...

Опять же, я действительно делаю это, даже если это не лучший выбор ...

Ответы [ 3 ]

5 голосов
/ 16 июня 2011

Да, вы можете регистрировать сборки, но это редко является хорошей идеей из-за проблем с производительностью.

Но если вы выполняете сложные числовые вычисления или аналогичные операции со скалярными значениями, это может дать вам большую гибкость.Но проблема остается в том, что SQL изначально ориентирован на наборы, а не на C #, поэтому вы легко столкнетесь с несоответствиями.

Вы также должны знать, что вы можете импортировать статические члены только в статические классы.

Но пример Этот класс, который намеренно не имеет пространства имен, так как кажется, что невозможно импортировать классы в пространстве имен.

    public static class Math
    {
        [Microsoft.SqlServer.Server.SqlFunction]
        public static int Add(int a, int b)
        {
            return a + b;
        }


        [Microsoft.SqlServer.Server.SqlProcedure]
        public static void Void(int a, int b)
        {
        }
    }

Требуется некоторый SQL, чтобы получить серверготов, и вы, вероятно, должны быть администратором.

    EXEC SP_CONFIGURE 'clr enabled', 1
    GO
    RECONFIGURE
    GO
    -- CONSIDER: DROP ASSEMBLY SqlClr
    GO
    CREATE ASSEMBLY SqlClr 
    FROM 'pathtoassembly'
    WITH PERMISSION_SET = SAFE;
    GO
    SELECT * FROM sys.assemblies
    GO
    CREATE FUNCTION [MathAdd] (@a int, @b int)
    RETURNS INT 
    AS EXTERNAL NAME [SqlClr].Math.[Add]
    GO 
    CREATE PROCEDURE [Void] @a INT, @b INT
    AS EXTERNAL NAME [SqlClr].Math.[Void]
    GO 
    SELECT dbo.MathAdd (1, 2)
    EXEC void 1, 2

ОПЯТЬ: Вы действительно должны быть уверены, что вам это нужно, это редко хорошая идея!(Я использовал его один раз для проверки электронной почты, просмотра DNS и т. Д., Но это было в системе, где вся бизнес-логика была написана на SQL. И это плохо!)

Некоторые полезные ссылки:

http://msdn.microsoft.com/en-us/library/ms189524.aspx

http://www.codeproject.com/KB/database/CLR_in_Sql_Server_2005.aspx

1 голос
/ 16 июня 2011

Используйте SQL CLR для выполнения точной функции, которую вы описали.

0 голосов
/ 16 июня 2011

Возможно . (Но читайте комментарии).

...