Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Mehrwertiger Datumsparameter in gespeicherter Prozedur?

Warum nicht einen Table-Valued Parameter verwenden ?

Erstellen Sie einen benutzerdefinierten Tabellentyp DateTimes auf SQL

create type DateTimes as table
(
    [Value] datetime
)

Dann ändern Sie Ihre gespeicherte Prozedur:

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

Jetzt können Sie @SourceFileDates behandeln als schreibgeschützte Tabellenvariable.

Bei der Angabe Ihres SqlCommand -Parameter wird ein Tabellenwertparameter als SqlDbType.Structured und als DataTable übergeben oder DataRowcollection . Sie können es also folgendermaßen füllen:

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

Jetzt ist alles schön und richtig typisiert ... und Sie müssen keine Zeichenfolgenanalyse oder -umwandlung durchführen.

Als Nebenbemerkung können Sie genauso gut fortfahren und Strings erstellen und Integers auch Typen; Sie werden süchtig nach TVPs und verwenden sie überall.