Подтвердить что ты не робот

Как использовать инструкцию SQL IN в файле fsharp.data.sqlclient?

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

[<Literal>]
let connectionString = @"Data Source=Localhost;Initial Catalog=Instrument;Integrated Security=True"
[<Literal>]
let query = "SELECT MacroName, MacroCode FROM Instrument WHERE MacroCode IN (@codeName)"

type MacroQuery = SqlCommandProvider<query, connectionString>
let cmd = new MacroQuery()
let res = cmd.AsyncExecute(codeName= [|"CPI";"GDP"|]) |> Async.RunSynchronously

Однако, codeName выводится как строковый тип вместо массива или списка и дает мне ошибку.

В качестве альтернативы я мог бы выполнить запрос без выражения оператора и фильтра на основе результата. Однако во многих других случаях, которые возвращают миллионы строк, я бы предпочел, чтобы данные фильтра на уровне SQL-сервера были более эффективными.

Я не нашел соответствующих образцов в документации fsharp.data.sqlclient. Пожалуйста, помогите!

4b9b3361

Ответ 2

Если у вас есть верхняя граница n для значений в списке IN, вы можете просто сделать n параметров. Если это неуправляемо, я боюсь, что предложение TVP - ваш лучший вариант. Причина, по которой библиотека FSharp.Data.SqlClient вряд ли когда-либо будет поддерживать это напрямую, заключается в том, что типы создаются на основе результатов sp_describe_undeclared_parameters; нет синтаксического анализатора T-SQL. У нас была одна верхняя граница в этом сценарии, и мы не хотели менять базу данных, поэтому этот параметр работал для нас.