Sql server 动态SQL中的数据过滤 set@vSqlFilters='(ABRA.START_DATE!>'+强制转换(@dEndDate为varchar(26))+”或ABRA.END_DATE!

Sql server 动态SQL中的数据过滤 set@vSqlFilters='(ABRA.START_DATE!>'+强制转换(@dEndDate为varchar(26))+”或ABRA.END_DATE!,sql-server,datetime,Sql Server,Datetime,我希望我的参数@dStartDate和@dEndDate保留它们周围的引号。目前,它们是由最终用户手动输入的,并带有引号。现在,我只是 (ABRA.START\u DATE!>2013-05-01或ABRA.END\u DATE!'2013-05-01'或ABRA.END\u DATE!

我希望我的参数@dStartDate和@dEndDate保留它们周围的引号。目前,它们是由最终用户手动输入的,并带有引号。现在,我只是

(ABRA.START\u DATE!>2013-05-01或ABRA.END\u DATE!<2011-04-05)
在我的查询中,而不是

set @vSqlFilters = '(ABRA.START_DATE !> ' + cast(@dEndDate as varchar(26)) + ' or ABRA.END_DATE !< ' + cast(@dStartDate as varchar(26)) + ')';
(ABRA.START\u DATE!>'2013-05-01'或ABRA.END\u DATE!<'2011-04-05')。
因为这是一个动态SQL查询,所以我需要将@dEndDate和@dStartDate转换为字符串。我还希望它将我的dStartDate和dEndDate视为日期而不是整数。我只是不知道如何让SQL来比较我的日期


谢谢

将双引号放在语句中希望出现单引号的任何位置:

(ABRA.START_DATE !> '2013-05-01' or ABRA.END_DATE !< '2011-04-05').
在我看来,这是更好的练习。它还可以通过执行计划重用(也可以不重用)提供更好的性能


我还建议您不要使用不等式运算符
。它们使其他人难以阅读和理解您的代码。在我的过滤器中使用
=
是的,我想要或。我知道这看起来很奇怪,我不能不透露公司的详细情况而深入细节。你得忍受我。哦,关于
,我觉得很奇怪。假设
结束日期
始终大于
开始日期
将返回整个表中的每一行!我很困惑
set @vSqlFilters = '(ABRA.START_DATE !> ''' + cast(@dEndDate as varchar(26))
+ ''' or ABRA.END_DATE !< ''' + cast(@dStartDate as varchar(26)) + ''')';
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;