Как использовать оператор 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, ',')
)