Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Parâmetro de data de vários valores no procedimento armazenado?


Por que não usar um parâmetro com valor de tabela ?

Crie uma tabela definida pelo usuário DateTimes em SQL
create type DateTimes as table
(
    [Value] datetime
)

Em seguida, altere seu procedimento armazenado:
ALTER PROCEDURE spSelectPlacementData
(
    @ClientID           SMALLINT,
    @SourceFileDates    DateTimes readonly -- must be readonly
)

Agora você pode tratar @SourceFileDates como uma variável de tabela somente leitura.

Ao especificar seu SqlCommand parâmetros, um parâmetro com valor de tabela é especificado como SqlDbType.Structured e passado como um DataTable ou DataRowcollection . Então, você pode preenchê-lo assim:
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
});

Agora tudo está bem e digitado corretamente... e você não precisa fazer nenhuma análise ou conversão de strings.

Como uma nota lateral, você também pode ir em frente e criar Strings e Integers tipos também; Você vai ficar viciado em TVPs e usá-los em todo o lugar.