【问题标题】:Stored procedure to select between dates?在日期之间选择的存储过程?
【发布时间】:2012-06-18 11:53:38
【问题描述】:

我正在编写一个存储过程来选择信息,我希望它只在日期之间进行选择?

这就是现在的样子:

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 之间运行选择以进入数据库,有人知道怎么做吗?

【问题讨论】:

  • 如果您发布 SchemaAudit 的表结构会有所帮助

标签: sql tsql date stored-procedures


【解决方案1】:

您应该使用sp_executesql 而不是 exec,它允许使用参数,避免 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

现在,关于开始日期和结束日期,您到底想做什么?

【讨论】:

  • 无效的列名开始日期,无效的列名结束日期
  • 由于@SearchField的使用,这不会仍然受到注入攻击吗?
  • @Chris- 是的,它应该被引用。编辑。
  • @Pomster 列名是你的。您能否发布一个有效的查询(非动态 sql 类型的查询?简单选择?)
  • 开始和结束日期我不知道他们做什么,你们一直把他们放在那里吗?我只是我的两个日期参数之间的查询
【解决方案2】:

使用BETWEN

Where StartDate BETWEEN @DateFrom and @DateTo

编辑:正如 Nalaka526 指出的那样,我错过了 EndDate, 您不能将 BETWEEN 与两个字段一起使用,您需要将其转换为 varchar 并使用 >= 和

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

【讨论】:

  • 你能把它放在和我的 exec 一样的格式吗( .... 我不能让这些 commers 正确 (')
  • exec (' SELECT DISTINCT ' + @SearchField + ' FROM SchemaAudit WHERE StartDate >= ' +Convert(varchar(20), @DateFrom) + 'AND WHERE EndDate >= ' + Convert(varchar(20),@DateTo) + ' ORDER BY ' + @SearchField +' ASC')
  • convert、varchar和20都是红色下划线的?
【解决方案3】:

您需要将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')

【讨论】:

  • @HackedByChinese 干杯,还有一些其他的语法问题,我现在已经更正了
  • Cast 、Datefrom、DateTo 和数字 20 都用红色下划线。
【解决方案4】:

忽略此技术可能使您容易受到 SQL 注入攻击这一事实,您需要使用 Convert 将日期转换为 varchar

Convert(varchar(20), DateTime, 111)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    相关资源
    最近更新 更多