Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Parametro data multivalore nella procedura memorizzata?

Perché non utilizzare un parametro Table-Valued ?

Crea un DateTimes di tipo tabella definito dall'utente su SQL

create type DateTimes as table
(
    [Value] datetime
)

Quindi modifica la tua procedura memorizzata:

ALTER PROCEDURE spSelectPlacementData
(
    @ClientID           SMALLINT,
    @SourceFileDates    DateTimes readonly -- must be readonly
)

Ora puoi trattare @SourceFileDates come una variabile di tabella di sola lettura.

Quando specifichi il tuo SqlCommand parametri, un parametro con valori di tabella è specificato come SqlDbType.Structured e passato come DataTable o DataRowcollection . Quindi, puoi popolarlo in questo modo:

var sourceFileDates = new DataTable();
sourceFileDates.Columns.Add("Value", typeof(DateTime));
foreach (DateTime file in job.sourceFiles)
{
    sourceFileDates.Rows.Add(file);
}
selectRunCommand.Parameters.Add(new SqlParameter {
    ParameterName = "@SourceFileDates", 
    Value = sourceFileDates,
    SqlDbType = SqlDbType.Structured // make sure you specify structured
});

Ora tutto è bello e digitato correttamente... e non devi eseguire analisi o casting di stringhe.

Come nota a margine, potresti anche andare avanti e creare Strings e Integers anche tipi; Ti appassionerai ai TVP e li userai ovunque.