Sql server 准备好的语句中的所有参数是否应始终使用占位符?

Sql server 准备好的语句中的所有参数是否应始终使用占位符?,sql-server,prepared-statement,Sql Server,Prepared Statement,我一直在试图找到一些东西,告诉我在参数是静态的情况下如何编写准备好的语句。 所有参数是否应始终使用占位符,即使值始终相同? 挑选* 来自学生 其中,准入状态=‘待定’和 学生之间的平均成绩?然后呢? 也就是说,在本例中,GPU状态将永远是“挂起”,但gpa将根据用户输入或不同的方法调用而改变 我知道这不是最好的例子,但我问的原因是,在替换所有静态参数时,我发现在数百行的查询中使用占位符和它们的静态值对应项在执行速度上有明显的差异 这样做可以接受吗?或者这是否违反了预先准备好的语句的使用标准?

我一直在试图找到一些东西,告诉我在参数是静态的情况下如何编写准备好的语句。 所有参数是否应始终使用占位符,即使值始终相同?

挑选*
来自学生
其中,准入状态=‘待定’和
学生之间的平均成绩?然后呢?
也就是说,在本例中,GPU状态将永远是“挂起”,但gpa将根据用户输入或不同的方法调用而改变

我知道这不是最好的例子,但我问的原因是,在替换所有静态参数时,我发现在数百行的查询中使用占位符和它们的静态值对应项在执行速度上有明显的差异


这样做可以接受吗?或者这是否违反了预先准备好的语句的使用标准?在我开始“优化”更大的查询之前,我想知道一种或另一种方法,即测试新索引,并用值替换?s,以查看执行速度是否有提升。

'Pending'
仅当您将其设为一个参数时才显式地作为一个参数,因此您的问题回避了这个问题。SQL Server具有一种称为自动参数化/参数嗅探的功能,对于某些形式的查询,常量(如
'Pending'
)会自动转换为参数,并重写查询(因此使用
准入状态='Completed'
)的未来查询也会匹配相同的执行计划)。这可能对参数化不足的应用程序是一个福音,也可能对实际需要不同计划的应用程序是一个问题,因为两个值的有效方法完全不同。所有这一切都是一个冗长而复杂的说法:一般来说,你不应该仅仅因为可以想象不同的值就将常量转换为参数,因为优化器可以生成具有已知值的更好的计划(尽管由于参数嗅探,它可能不会)。仅当确实需要更改值时才使用参数。在这种情况下会产生更糟糕的结果,有很多文件证明可以避免或减轻参数嗅探。当然,不要开始将参数替换为字符串来加快速度——SQL注入是一个真正的风险。