(а) вам нужно заключить переменные даты / даты в одинарные кавычки.В противном случае запрос заканчивается как:
WHERE Tarih BETWEEN 2012-03-14 ...
, который оценивается как числовое выражение, поэтому получается:
WHERE Tarih BETWEEN 1995 ... -- and no that's not the year
(b) вы не должны преобразовываться в DATETIME.Попробуйте:
set @sorgu+='Tarih between '''+convert(CHAR(8),@ilktarih,112)+'''
and '''+convert(CHAR(8),@sontarih ,112)+''' and '
Однако я не понимаю, почему вы вообще используете динамический SQL.Почему бы и нет:
ALTER PROCEDURE [dbo].[DetayliArama]
@ilktarih DATE = NULL,
@sontarih DATE = NULL,
@islem NVARCHAR(10) = NULL,
@birim INT = NULL
AS
BEGIN
SET NOCOUNT ON;
SELECT KasaID, Aciklama, Tutar, Tarih, Islem, IsDeleted, KasalarID
FROM dbo.KasaTable
WHERE IsDeleted = 0
AND KasalarID = @birim
AND Islem LIKE COALESCE('%'+@islem+'%', Islem)
AND Tarih BETWEEN COALESCE(@ilktarih, '19000101')
AND COALESCE(@sontarih, '20301231');
END
GO
В некоторых случаях может быть более эффективно использовать динамический SQL, чтобы избежать плохих планов из-за различных параметров.Но я думаю, что вы должны иметь дело с этим, когда вы сталкиваетесь с этим.