Как использовать оператор 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 выводится как строковый тип вместо массива или списка и выдает ошибку.

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

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

3 ответа

Раздел "См. Табличные параметры (TVP)" в документации: http://fsprojects.github.io/FSharp.Data.SqlClient/configuration%20and%20input.html

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

Ты можешь использовать STRING_SPLIT абстрагироваться от использования табличных параметров. Похоже, вы также должны сначала объявить параметр.

DECLARE @param varchar(1000) = @commaSeparatedList
SELECT Col1 FROM MyTable
WHERE Col2 IN (
  SELECT value FROM STRING_SPLIT(@param, ',')
)
Другие вопросы по тегам