#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, который создает тип для каждой строки, который затем передается в агрегат.