0
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 来比较我的日期。

谢谢!

4

1 回答 1

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在过滤器中使用吗?我可能会遗漏一些东西。

于 2013-05-08T21:42:36.687 回答