set @vSqlFilters = '(ABRA.START_DATE !> ' + cast(@dEndDate as varchar(26)) + ' or ABRA.END_DATE !< ' + cast(@dStartDate as varchar(26)) + ')';
我希望我的参数@dStartDate和@dEndDate能够保留它们周围的引号。目前,它们由最终用户手动输入并带有引号。现在,我得到了
我的查询中的 (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来比较我的日期。
谢谢!
答案 0 :(得分: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
吗?我可能会遗漏一些东西。