Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wielowartościowy parametr daty w procedurze składowanej?

Dlaczego nie użyć parametru o wartościach tabelarycznych ?

Utwórz zdefiniowaną przez użytkownika tabelę typu DateTimes na SQL

create type DateTimes as table
(
    [Value] datetime
)

Następnie zmień procedurę składowaną:

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

Teraz możesz traktować @SourceFileDates jako zmienna tabelowa tylko do odczytu.

Podczas określania SqlCommand parametrów, parametr z wartościami przechowywanymi w tabeli jest określony jako SqlDbType.Structured i przekazany jako DataTable lub DataRowcollection . Możesz więc wypełnić to tak:

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

Teraz wszystko jest ładne i poprawnie napisane... i nie musisz robić żadnego parsowania ani rzutowania łańcuchów.

Na marginesie, równie dobrze możesz iść dalej i stworzyć Strings i Integers typy również; Wciągniesz się w programy TVP i będziesz ich używać w każdym miejscu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przeprowadzić wyszukiwanie z uwzględnieniem wielkości liter przy użyciu funkcji LIKE?

  2. Czy wszyscy migrują do chmury?

  3. Pomiń niektóre kolumny w SqlBulkCopy

  4. Czy widok jest szybszy niż proste zapytanie?

  5. WHERE IN (tablica identyfikatorów)