选择日期范围的存储过程?

3

我将编写一个存储过程来选择信息,希望只选择在日期之间的信息。

现在代码如下:

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')

我希望选择在@DateTo和DateFrom之间的条目进入数据库,有人知道如何做吗?


1
如果您发布SchemaAudit的表结构,将会很有帮助。 - Chris Gessler
4个回答

4

不要使用 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

现在关于开始和结束日期,你具体想要做什么呢?

1
无效的列名startdate,无效的列名EndDate。 - Pomster
由于@SearchField的使用,这是否仍可能受到注入攻击的影响? - Chris Gessler
@Pomster 列名由您自己决定。您能否发布一个可用的查询(非动态 SQL 查询?简单选择查询?) - Nikola Markovinović
1
开始和结束日期我不知道它们有什么用,你们为什么总是把它们放在那里?我只想让查询在我的两个日期参数之间。 - Pomster
谢谢,它说日期列名无效。 - Pomster
显示剩余4条评论

2

使用BETWEEN函数。

Where StartDate BETWEEN @DateFrom and @DateTo

编辑:如Nalaka526所指出的,我错过了EndDate, 你不能使用BETWEEN来比较两个字段,您需要将其转换为varchar并使用>=和<=在范围之间进行比较。Curt的解决方案就是这样做。

 WHERE StartDate >= ' + Convert(varchar(20),@DateFrom) + 'AND EndDate >= ' + Convert(varchar(20),@DateTo) + '

1
你能把它放在和我的exec(...)相同的格式中吗?我无法正确使用这些逗号(')。 - Pomster
exec (' SELECT DISTINCT ' + @SearchField + ' FROM SchemaAudit WHERE StartDate >= ' +Convert(varchar(20), @DateFrom) + 'AND WHERE EndDate >= ' + Convert(varchar(20),@DateTo) + ' ORDER BY ' + @SearchField +' ASC') - Habib
1
转换、varchar和20都被用红色下划线标出来了吗? - Pomster

1

您需要将日期参数转换为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')

@HackedByChinese 朋友,还有一些语法问题,我已经修正了。 - Curtis
1
Cast,Datefrom,DateTo和数字20都用红色下划线标出。 - Pomster

-1
忽略这种技术可能使您容易受到 SQL 注入攻击的事实,您需要使用 Convert 将日期转换为 varchar。
Convert(varchar(20), DateTime, 111)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接