0

我下面的动态查询有效,但想知道我下面的内容是否可以优化,或者是否有更好的方法。

我有一个网络表单,用户可以在其中输入位置和收集日期。对于收集的日期,我有收集的起始日期和收集的日期。用户将收集的截止日期留空,在这种情况下,它将执行比收集的起始日期更大的操作。

请注意我是如何在下面执行 IS NOT NULL 和 1=1 的。还想知道动态 SQL 是否是最好的方法,或者是否有更简单的方法来做到这一点。

    DECLARE @sql varchar(max);

    SET @sql = 'SELECT * from tblProgram WHERE 1=1' 

    IF (@Location IS NOT  NULL)
    BEGIN
      SET @sql = @sql + ' AND Location = ' +  @Location
    END      

    IF (@FromDateCollected IS NOT  NULL AND @ToDateCollected IS NOT NULL)
    BEGIN
         SET @sql = @sql + ' AND pw.DateCollected >= ' +  QUOTENAME(convert(varchar, @FromDateCollected,101),'''') 
         + ' AND pw.DateCollected <= ' + QUOTENAME(convert(varchar, @ToDateCollected,101),'''')

    END
    ELSE IF (@FromDateCollected IS NOT  NULL AND @ToDateCollected IS  NULL)
    BEGIN
      SET @sql = @sql + ' AND pw.DateCollected >= ' +  QUOTENAME(convert(varchar, @FromDateCollected,101),'''') 

    END 

   exec(@sql)
4

1 回答 1

4

那么你可以做 ta.speot.is 评论使用静态 SQL 并做

WHERE x is null or x > date_column? 

但是,如果您坚持使用动态 SQL,则应使用sp_executeSQL的参数化 SQL 语句

它更易于阅读,您不必使用引号名称,并且可以防止 SQL 注入

DECLARE @Location int 
DECLARE @FromDateCollected datetime 
DECLARE @ToDateCollected datetime
SET  @ToDateCollected  = '1/02/2012'



DECLARE @sql nvarchar(max)
DECLARE @ParmDefinition nvarchar(max)

SET  @ParmDefinition = N'@Location int , @FromDateCollected datetime, @ToDateCollected datetime ';

SET @sql = N'SELECT * from tblProgram WHERE 1=1' 

IF (@Location IS NOT  NULL)
BEGIN
   SET @sql = @sql + N' AND Location = @Location'
END      

IF (@FromDateCollected IS NOT  NULL AND @ToDateCollected IS NOT NULL)
BEGIN
   SET @sql = @sql + N' AND pw.DateCollected >= @FromDateCollected '
      + N' AND pw.DateCollected <= @ToDateCollected '

END
ELSE IF (@FromDateCollected IS NOT  NULL AND @ToDateCollected IS  NULL)
BEGIN
   SET @sql = @sql + N' AND pw.DateCollected >= @FromDateCollected' 

END 

exec sp_executesql @SQL, @ParmDefinition, @Location = @Location,
                                  @FromDateCollected = @FromDateCollected,
                                      @ToDateCollected = @ToDateCollected

演示

于 2012-10-16T22:11:25.447 回答