2012-03-14 4 views
0

яя получаю ошибку SQL преобразования типа данных VARCHAR датировать

Msg 8114, уровень 16, состояние 5, Procedure 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 ''%'[email protected]+'%'' 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) 
+0

Обычно я отлаживаю подобные вещи, запуская логику как автономный sql и проверяя переменные, которые вы пытаетесь преобразовать. Если вы это сделаете, каково значение varchar, которое вы пытаетесь преобразовать в дату? – Gavin

+0

Также вы должны использовать 'exec sp_executesql', а не' exec() '. http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/17/bad-habits-to-kick-using-exec-instead-of-sp-executesql.aspx –

ответ

1

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

WHERE Tarih BETWEEN 2012-03-14 ... 

который получает оценивается как числовое выражение, так заканчивается время:

WHERE Tarih BETWEEN 1995 ... -- and no that's not the year 

(б) вы не должны быть преобразования в 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('%'[email protected]+'%', Islem) 
    AND Tarih BETWEEN COALESCE(@ilktarih, '19000101') 
     AND COALESCE(@sontarih, '203'); 
END 
GO 

В некоторых случаях может быть более эффективным использование динамического SQL, чтобы избежать плохих планов из-за разных параметров. Но я думаю, вы должны иметь дело с этим, когда сталкиваетесь с этим.

+0

теперь он отлично работает ... thx u очень много – cooolstaff

+0

, поэтому я новичок в sql thk u, чтобы решить мою проблему и показать мне другой способ – cooolstaff

Смежные вопросы