2014-10-08 36 views
12

我有以下示例代碼。目標是運行帶有多個輸入參數的SQL語句。如何在fsharp.data.sqlclient中使用SQL IN語句?

[<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 Server級別過濾數據效率更高。

我在fsharp.data.sqlclient的文檔中找不到任何相關示例。請幫忙!

+0

我假設你的目標是SQL Server。那麼,它不使用數組或列表的原因很簡單--SQL Server沒有這種數據類型。它有一種專門用於存儲多項數據的數據類型 - 表格。我不熟悉[tag:fsharp.data.sqlclient],但我建議您嘗試瞭解如何將表值參數傳遞給它。 – 2014-10-08 07:01:25

回答

4

如果你有在IN列表中的值的上限ñ,你可以只讓ñ參數。如果這是無法管理的,恐怕TVP的建議是你最好的選擇。 FSharp.Data.SqlClient庫不可能直接支持這個原因是因爲這些類型是基於sp_describe_undeclared_parameters的結果生成的;沒有T-SQL解析器。在這種情況下,我們有一個數字上限,並且不願意更改數據庫,所以這個選項對我們有效。