当我在WHERE
子句中看到此代码时,我在SQL Server中重构了一个沉重且写得非常糟糕的存储过程:
SET @SELECT = @SELECT + '
CAST(LOG_MODULO.DataHora AS DATE) >= '''+ @DATAINI + ''' AND
LOG_MODULO.DataHora <= '''+ @DATAFIM +' 23:59:00'' ' ;
LOG_MODULO.DataHora
是DATETIME
列,@DATAINI
和@DATAFIM
是VARCHAR(15)
个变量,是的,此查询是通过字符串连接构建的。
我重构了这个:
AND LOG_MODULO.DataHora BETWEEN @DATAINI AND @DATAFIM + ' 23:59:59'
但我的版本运行时间是其前身的5倍。
这是为什么?在不改变输入的情况下编码这个的好方法是什么?
答案 0 :(得分:1)
由于您使用常规SQL将其转换为动态sql,我将@ datafim2声明为datetime并设置为dateadd(day,1,@ datafim)...然后执行dataHora&gt; = @DataIni和datahora&lt; @ datafim2。要点使列的数据类型与变量相同。