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

менты MSDN о табличных функциях Sql Clr состояния:Табличные функции Transact-SQL материализуют результаты вызова функции в промежуточную таблицу. ... Напротив, табличные функции CLR представляют собой потоковую альтернативу. Не требуется, чтобы весь набор результатов был реализован в одной таблице. Объект IEnumerable, возвращаемый управляемой функцией, напрямую вызывается планом выполнения запроса, который вызывает табличную функцию, а результаты используются в пошаговом режиме. ... Это также лучшая альтернатива, если вы возвращаете очень большое количество строк, потому что они не должны быть материализованы в памяти в целом.

Затем я обнаружил, что доступ к данным в методе «Заполнить строку» запрещен.

, Это означает, что вам все равно придется делать все ваши данные в методе init и хранить их в памяти, ожидая вызова «Fill row». Я что-то не так понял? Если я не форсирую свои результаты в массив или список, я получаю сообщение об ошибке: «ExecuteReader требует открытого и доступного соединения. Текущее состояние соединения закрыто. 'Пример кода:

Я имею дело с несколькими миллионами строк здесь. Есть ли способ сделать это лениво?

[<SqlFunction(DataAccess = DataAccessKind.Read, FillRowMethodName = "Example8Row")>]
static member InitExample8() : System.Collections.IEnumerable = 
   let c = cn() // opens a context connection
   // I'd like to avoid forcing enumeration here:
   let data = getData c |> Array.ofSeq
   data :> System.Collections.IEnumerable

static member Example8Row ((obj : Object),(ssn: SqlChars byref)) = 
   do ssn <- new SqlChars(new SqlString(obj :?> string))
   ()

То, как я читаю документацию, похоже, подразумевает, что с табличной функцией весь набор результатов генерируется и помещается куда-то - возможно, в память, если она мала, а в противном случае - в базу данных tempdb - до того, как ее результаты будут возвращены клиенту. С CLR набор результатов может начать возвращаться клиенту непосредственно из буфера памяти, как только появятся некоторые записи. Я не знаю, стоит ли вам о чем-то явно беспокоиться. Я думаю, что MSDN просто объясняет внутреннюю работу обоих типов табличных функций. Если я не понял статью.

Ответы на вопрос(0)

Ваш ответ на вопрос