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

4

4 回答 4

4

您应该使用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

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

于 2012-06-15T12:18:23.867 回答
2

使用之间

Where StartDate BETWEEN @DateFrom and @DateTo

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

 WHERE StartDate >= ' + Convert(varchar(20),@DateFrom) + 'AND EndDate >= ' + Convert(varchar(20),@DateTo) + '
于 2012-06-15T11:57:41.177 回答
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')
于 2012-06-15T11:57:45.040 回答
-1

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

Convert(varchar(20), DateTime, 111)
于 2012-06-15T12:00:16.567 回答