Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Paramètre de date à valeurs multiples dans la procédure stockée ?

Pourquoi ne pas utiliser un paramètre de table ?

Créer un type de table défini par l'utilisateur DateTimes sur SQL

create type DateTimes as table
(
    [Value] datetime
)

Modifiez ensuite votre procédure stockée :

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

Vous pouvez maintenant traiter @SourceFileDates en tant que variable de table en lecture seule.

Lors de la spécification de votre SqlCommand paramètres, un paramètre de table est spécifié comme SqlDbType.Structured et transmis en tant que DataTable ou DataRowcollection . Ainsi, vous pouvez le remplir comme suit :

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

Maintenant, tout est beau et correctement typé... et vous n'avez pas à faire d'analyse ou de conversion de chaîne.

En passant, vous pouvez aussi bien créer des Strings et Integers types aussi; Vous deviendrez accro aux TVP et les utiliserez partout.