2014-10-08 16 views
12

Ho il seguente codice di esempio. L'obiettivo è eseguire istruzioni SQL con più parametri di input.Come utilizzare l'istruzione SQL IN in fsharp.data.sqlclient?

[<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 

Tuttavia, Codename viene dedotto essere di tipo stringa invece di un array o lista e mi danno un errore.

In alternativa, potrei eseguire la query senza dove istruzione e filtro si basano sul risultato. Tuttavia, in molti altri casi che restituiscono milioni di righe, preferirei i dati dei filtri a livello del server SQL per essere più efficienti.

Non ho trovato alcun campione rilevante sulla documentazione di fsharp.data.sqlclient. Per favore aiuto!

+0

Suppongo che abbia come target SQL Server. Bene, il motivo per cui non sta usando un array o elenco è semplice - SQL Server non ha tali tipi di dati. Ha un tipo di dati appositamente progettato per la memorizzazione di più elementi di dati, la tabella. Non ho dimestichezza con [tag: fsharp.data.sqlclient], ma ti consiglio di provare a scoprire come passare i parametri con valori di tabella. –

risposta

4

Se si dispone di un limite superiore n sui valori della lista IN, si può solo fare n parametri . Se questo è ingestibile, temo che il suggerimento TVP sia la soluzione migliore. Il motivo per cui è improbabile che la libreria FSharp.Data.SqlClient supporti questo direttamente è perché i tipi vengono generati in base ai risultati da sp_describe_undeclared_parameters; non esiste un parser T-SQL. Avevamo un limite superiore di una cifra in questo scenario e non volevamo cambiare il database, quindi questa opzione funzionava per noi.

Problemi correlati