Как обойти невозможность ВСТАВКИ или УДАЛЕНИЯ в функции

#sql-server #function #insert

Вопрос:

У меня есть проблема, из-за которой я не вижу хорошего способа обойти ВСТАВКУ и УДАЛЕНИЕ внутри функции. Моя проблема в том, что у меня есть функция CLR, которую я вызываю внутри своей функции SQL, которая должна извлекать данные из промежуточной таблицы (поскольку я не могу вызвать эту функцию с переменной таблицы типов, как мне хотелось бы), и поэтому мне нужно подготовить данные, которые функция CLR сначала использует в этих промежуточных таблицах. Я думаю, что приведенный ниже фрагмент показывает, что я пытаюсь сделать:

     DELETE FROM MATRIX.LinearEquationSolverIntermediaryMatrixA
    DELETE FROM MATRIX.LinearEquationSolverIntermediaryMatrixB

    INSERT INTO MATRIX.LinearEquationSolverIntermediaryMatrixA  ---Intermediary Table to hold values for CLR function. Purge table after use
            ( i, j, value )
    SELECT  i , j ,value FROM @A
    INSERT INTO MATRIX.LinearEquationSolverIntermediaryMatrixB  ---Intermediary Table to hold values for CLR function. Purge table after use
            ( i, j, value )
    SELECT  i , j ,value FROM @B

    INSERT INTO @c_
    SELECT value, idx FROM [dbo].[f_SolveLinearEquation]()  ---CLR Function to solve linear equation very fast.

    DELETE FROM MATRIX.LinearEquationSolverIntermediaryMatrixA
    DELETE FROM MATRIX.LinearEquationSolverIntermediaryMatrixB
 

Есть ли способ сделать что-то подобное внутри функции? Если есть другой способ подхода к функции CLR, который я не рассматриваю, это, конечно, тоже то, что я мог бы рассмотреть

Комментарии:

1. Начните с самого начала: зачем вам вообще нужна функция CLR? И если вы это сделаете, возможно, вместо этого вам действительно понадобится агрегат CLR. У нас здесь нет контекста, мы не знаем, что вы на самом деле пытаетесь сделать. У нас даже нет полного кода для вашего UDF.

2. Привет, извини, ладно. Поэтому я занимаюсь линейной алгеброй в SQL и мне нужен способ решения системы линейных уравнений, поэтому с этой целью я создал функцию CLR, которая просто решает систему линейных уравнений с помощью пакета mathnumerics nuget. Интуитивно я,конечно, просто хотел бы вызвать эту функцию с помощью SolveLinearEquation(A, B), где A и B-мои матрицы, но, поскольку функции CLR не позволяют, у меня есть другое решение, в котором вставляются данные в таблицы, которые затем использует функция CLR. UDF просто создает матрицы @A и @B, а затем использует мою функцию CLR для решения системы.

3. Похоже, вам действительно нужен агрегат CLR, который примет полную таблицу и выдаст один результат

4. Я понимаю, значит, эта созданная пользователем агрегатная функция будет использоваться в запросе select, а затем простым выбором из @A и @B? Но может ли агрегатная функция обрабатывать входные данные из нескольких столбцов? В моем случае мне нужно было бы ввести не только значения в матрицах, но и координаты

5. Я думаю, что у вас может быть просто несколько параметров Accumulate . За исключением этого, вам придется либо объединить значения вместе, varbinary как это cast(x as binary(4)) cast(y as binary(4)) , то вы получите его в виде byte[] массива в C#. Или вы можете определить определенный пользователем тип, содержащий все значения, и иметь UDF, который создает тип для каждой строки, который затем передается в агрегат.