我有以下示例代码。目标是使用多个输入参数运行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的文档中找到任何相关的示例。请帮忙!
答案 0 :(得分:6)
&#34;参见表值参数(TVP)&#34;文档中的部分: http://fsprojects.github.io/FSharp.Data.SqlClient/configuration%20and%20input.html
答案 1 :(得分:4)
如果IN
列表中的值有上限 n ,则可以只生成 n 参数。如果这是无法管理的,我担心TVP的建议是你最好的选择。 FSharp.Data.SqlClient库不太可能直接支持这一点的原因是因为类型是基于sp_describe_undeclared_parameters的结果生成的;没有T-SQL解析器。在这种情况下,我们只有一位数的上限,并且不愿意更改数据库,所以这个选项对我们有用。
答案 2 :(得分:0)
您可以使用STRING_SPLIT
来抽象化表值参数的使用。看来您还必须先声明该参数。
DECLARE @param varchar(1000) = @commaSeparatedList
SELECT Col1 FROM MyTable
WHERE Col2 IN (
SELECT value FROM STRING_SPLIT(@param, ',')
)