sql >> Base de Datos >  >> RDS >> Sqlserver

¿Parámetro de fecha de valores múltiples en el procedimiento almacenado?

¿Por qué no usar un Parámetro con valores de tabla ?

Cree un tipo de tabla definido por el usuario DateTimes en SQL

create type DateTimes as table
(
    [Value] datetime
)

Luego modifique su procedimiento almacenado:

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

Ahora puede tratar @SourceFileDates como una variable de tabla de solo lectura.

Al especificar su SqlCommand parámetros, un parámetro con valores de tabla se especifica como SqlDbType.Structured y pasó como DataTable o DataRowcollection . Entonces, puede completarlo así:

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
});

Ahora todo está bien y correctamente escrito... y no tienes que hacer ningún análisis o conversión de cadenas.

Como nota al margen, también podría continuar y crear Strings y Integers tipos también; Te engancharás a los TVP y los usarás en todas partes.