Сохраненная процедура с необязательными параметрами DateTime в SQL Server

Как написать этот запрос на select в SQL Server, когда параметры datetime ( @StartDate & @EndDate ) являются необязательными в этой хранимой процедуре?

 CREATE PROCEDURE [dbo].[prSearchEmployees] ( @Id INT = NULL ,@FullName VARCHAR(20) = NULL ,@Age INT = NULL ,@StartDate = NULL ,@EndDate = NULL ) AS BEGIN SELECT * FROM Employee WHERE Id = ISNULL(@Id, Id) AND FullName LIKE ISNULL(@FullName + '%', FullName) AND Age = ISNULL(@Age, Age) END 

Вы могли бы добавить две новые переменные в верхней части вашего sproc. И назначить на основе функции ISNULL

 CREATE PROCEDURE [dbo].[prSearchEmployees] ( @Id INT = NULL ,@FullName VARCHAR(20) = NULL ,@Age INT = NULL ,@StartDate DATETIME = NULL ,@EndDate DATETIME = NULL ) AS BEGIN DECLARE @SDate DATETIME DECLARE @EDate DATETIME SET @SDate = ISNULL(@StartDate, GETDATE()) SET @EDate = ISNULL(@EndDate, GETDATE()) SELECT * FROM Employee WHERE Id = ISNULL(@Id, Id) AND FullName LIKE ISNULL(@FullName + '%', FullName) AND Age = ISNULL(@Age, Age) AND Date BETWEEN @SDate AND @EDate 

Я знаю, что это старый пост, но есть альтернативы, которые немного более кратки. Этот пост прекрасно описывает это. Поэтому в предыдущем примере вы сделали бы что-то вроде

  CREATE PROCEDURE [dbo].[prSearchEmployees] ( @Id INT = NULL ,@FullName VARCHAR(20) = NULL ,@Age INT = NULL ,@StartDate DATETIME = NULL ,@EndDate DATETIME = NULL ) AS BEGIN SELECT * FROM Employee WHERE ((@Id IS NULL) OR (Id = @Id)) AND ((@FullName IS NULL) OR (FullName LIKE @FullName + '%')) AND ((@Age IS NULL) OR (Age = @Age)) AND ((@SDate IS NULL) OR (Date BETWEEN @SDate AND @EDate)) 

Вам просто нужно определить тип данных @StartDate и @EndDate как Date . Вы можете попробовать следующее:

 CREATE PROCEDURE [dbo].[prSearchEmployees] ( @Id INT = NULL ,@FullName VARCHAR(20) = NULL ,@Age INT = NULL ,@StartDate DATETIME= NULL ,@EndDate DATETIME= NULL ) AS BEGIN DECLARE @StDate DATETIME DECLARE @EtDate DATETIME SET @StDate = ISNULL(@StartDate ,NOW()) SET @EtDate = ISNULL(@EndDate , NOW()) SELECT * FROM Employee WHERE Id = ISNULL(@Id, Id) AND FullName LIKE ISNULL(@FullName + '%', FullName) AND Age = ISNULL(@Age, Age) AND Date BETWEEN @StDate AND @EtDate END 

Для передачи null в поле даты

объявить строку dob

при присваивании объекта stud_dtl_obj.dob = dob.Text == ""? null: dob.Text;

при назначении процедуры SqlHelper.MakeParam ("@ dob", obj_stud_dtl.dob),

внутри процедуры @ dob date = NULL,

Давайте будем гением компьютера.