我正在为选择信息编写存储过程,我希望它只在日期之间进行选择?
这就是现在的样子:
ALTER PROCEDURE [dbo].[AutoCompleate]
@DateFrom datetime,
@DateTo datetime,
@SearchField varchar(50)
AS
-- V1.0 : ShaunM : 15 jun 2012
-- AutoComplete textbox
exec ('
SELECT DISTINCT ' +
@SearchField + ' FROM SchemaAudit
ORDER BY ' + @SearchField +' ASC')
我希望select在@DateTo和DateFrom之间运行以进入数据库,是否有人知道如何执行此操作?
答案 0 :(得分:2)
使用BETWEN
Where StartDate BETWEEN @DateFrom and @DateTo
编辑:正如Nalaka526指出的那样,我错过了EndDate,
您不能将BETWEEN用于两个字段,您需要将其转换为varchar并使用> =和< =来比较范围。 Curt解决方案正在这样做。
WHERE StartDate >= ' + Convert(varchar(20),@DateFrom) + 'AND EndDate >= ' + Convert(varchar(20),@DateTo) + '
答案 1 :(得分:2)
而不是exec,你应该使用允许使用参数的sp_executesql,避免Sql注入的风险,并避免日期作为字符串传递的潜在问题。第一个参数是查询,第二个是参数列表及其类型,其余是参数值。
alter PROCEDURE [dbo].[AutoCompleate]
@DateFrom datetime,
@DateTo datetime,
@SearchField varchar(50)
AS
-- V1.0 : ShaunM : 15 jun 2012
-- AutoComplete textbox
declare @sql nvarchar(max)
set @sql = 'SELECT DISTINCT '
+ quotename(@SearchField)
+ ' FROM SchemaAudit'
+ ' WHERE [Date] between @from AND @to ORDER BY '
+ quotename(@SearchField)
+ ' ASC'
exec sp_executesql @sql,
N'@from datetime, @to datetime',
@from = @DateFrom, @to = @DateTo
现在,关于开始和结束日期,您究竟想做什么?
答案 2 :(得分:1)
您需要将CAST
日期参数设为varchar
:
exec ('
SELECT DISTINCT ' +
@SearchField + ' FROM SchemaAudit WHERE StartDate >= "' + CAST(@DateFrom as varchar(20)) + '" AND EndDate >= "' + CAST(@DateTo as varchar(20)) + '"
ORDER BY ' + @SearchField +' ASC')
答案 3 :(得分:-1)
忽略这种技术可能使您容易受到SQL注入攻击的事实,您需要使用Convert
将日期转换为varchar
Convert(varchar(20), DateTime, 111)