14

我有以下示例代码。目标是运行带有多个输入参数的 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 的文档中没有找到任何相关示例。请帮忙!

4

3 回答 3

6

文档中的“请参阅表值参数 (TVP)”部分:http: //fsprojects.github.io/FSharp.Data.SqlClient/configuration%20and%20input.html

于 2014-10-08T13:21:37.507 回答
4

如果列表中的值有上限nIN ,则可以只设置n 个参数。如果这无法管理,恐怕 TVP 建议是您的最佳选择。FSharp.Data.SqlClient 库不太可能直接支持这一点的原因是因为这些类型是根据sp_describe_undeclared_pa​​rameters的结果生成的;没有 T-SQL 解析器。在这种情况下,我们有一个个位数的上限并且不愿意更改数据库,所以这个选项对我们有用。

于 2016-01-13T02:04:30.180 回答
1

您可以使用STRING_SPLIT抽象出表值参数的使用。看来您还必须先声明参数。

DECLARE @param varchar(1000) = @commaSeparatedList
SELECT Col1 FROM MyTable
WHERE Col2 IN (
  SELECT value FROM STRING_SPLIT(@param, ',')
)
于 2018-08-27T09:44:13.960 回答