Я получаю ошибку SQL при преобразовании типа данных varchar в дату - PullRequest
0 голосов
/ 15 марта 2012

Я получаю

Сообщение 8114, уровень 16, состояние 5, процедура DetayliArama, строка 0 Ошибка преобразования типа данных varchar в дату.

ошибка.Есть идеи?

Вот моя хранимая процедура:

ALTER proc [dbo].[DetayliArama]
(
@ilktarih date = null,
@sontarih date = null,
@islem nvarchar(10) = null,
@birim int = null
)
as
declare @sorgu nvarchar (max)
set @sorgu = 'select KasaID,Aciklama,Tutar,Tarih,Islem,IsDeleted,KasalarID 
from KasaTable where IsDeleted=0 and KasalarID='+CONVERT(varchar(10),@birim)+' AND ' 
if (@islem is not null) 
    set @sorgu += 'Islem like ''%'+@islem+'%'' and '
if (@ilktarih is not null) 
    set @sorgu+='Tarih between '+convert(datetime,@ilktarih,120)+' 
        and '+convert(datetime,@sontarih ,120)+' and '                      
set @sorgu+='1=1 order by Tarih DESC'
exec (@sorgu)

1 Ответ

1 голос
/ 15 марта 2012

(а) вам нужно заключить переменные даты / даты в одинарные кавычки.В противном случае запрос заканчивается как:

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, чтобы избежать плохих планов из-за различных параметров.Но я думаю, что вы должны иметь дело с этим, когда вы сталкиваетесь с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...