2013-05-08 54 views
0
set @vSqlFilters = '(ABRA.START_DATE !> ' + cast(@dEndDate as varchar(26)) + ' or ABRA.END_DATE !< ' + cast(@dStartDate as varchar(26)) + ')'; 

我希望我的參數@dStartDate和@dEndDate保留它們周圍的引號。目前,他們是由最終用戶用引號圍繞它們手動輸入的。現在,我只是得到動態SQL中的日期過濾

(ABRA.START_DATE !> 2013-05-01 or ABRA.END_DATE !< 2011-04-05)我的查詢,而不是

(ABRA.START_DATE !> '2013-05-01' or ABRA.END_DATE !< '2011-04-05'). 

由於這是扔進一個動態的SQL查詢,我需要我的@dEndDate和@dStartDate定投作爲字符串。另外我希望它把我的dStartDate和dEndDate當作不是整數的日期。我只是不明白我如何通過SQL來比較我的日期。

謝謝!聲明中的任何位置

回答

1

戴上了一倍,達到單引號你想要一個單引號出現:

set @vSqlFilters = '(ABRA.START_DATE !> ''' + cast(@dEndDate as varchar(26)) 
+ ''' or ABRA.END_DATE !< ''' + cast(@dStartDate as varchar(26)) + ''')'; 

然而,有沒有必要做這個。隨着sp_executesql你可以使用參數:

DECLARE @SQL nvarchar(max); 
SET @SQL = 'SELECT * FROM dbo.ABRA ABRA WHERE ABRA.START_DATE <= @dEndDate' 
+ ' AND ABRA.END_DATE >= @dStartDate'; 
EXEC sp_executesql @SQL, N'@dStartDate datetime, @dEndDate datetime', 
@dStartDate, @dEndDate; 

這一點,在我的腦海裏,更好的做法。它也可以通過執行計劃重用(或不可能)提供更好的性能。

我還想建議您不要使用不等式運算符!,!<!>。他們很難讓其他人閱讀並理解你的代碼。使用<>,>=<=

最後,你確定要在你的過濾器中使用OR嗎?我可能會錯過一些東西。

+0

是的,我想要在我的過濾器。我知道這看起來很奇怪,如果不泄露公司的細節,我就不能詳談。你只需要忍受我。 – Glassjawed 2013-05-08 21:55:22

+0

哦,關於'OR',我覺得很奇怪。假設'END_DATE'總是大於'START_DATE',那麼這裏的'OR'將會在整個表中的每一行返回**!我很困惑。 :) – ErikE 2013-05-09 17:39:03