案例:我需要一个sp来检查是否只有一个参数不为null并执行select语句,该语句仅出于速度原因而在仅一列中搜索LIKE运算符
出于速度执行的原因,我想以最有效的方式执行以下操作
IF(@MiddleName ='' AND @LastName='')
BEGIN SELECT Name, MiddleName, LastName, Age, Address, Location, Company
FROM People WHERE (Name LIKE '%'+@Name+'%')
END
BEGIN
IF(@LastName ='' AND @Name='')
BEGIN SELECT Name, MiddleName, LastName, Age, Address, Location, Company
FROM People WHERE (MiddleName LIKE '%'+@MiddleName+'%')
对于每列,依此类推,如您所见,我将需要进行所有可能的组合
您可能会问为什么不在目标列中使用NOT ''
?这是因为最后一个选择会检查所有列,以防所有参数都不为空
编辑:查询已经可以了,我在问如何改善它
答案 0 :(得分:3)
首先,使用动态SQL更好。
第二,LIKE“%@ MIddleName%”不是参数的工作方式-LIKE @Parameter是有效的,但是您不能将@parameter放在字符串中。根本不会被解析。期。基本上,您需要使用Dynamic SQL并使用sp_executesql。
根据定义,带有%value%的查询不可更改,因此普通索引不起作用。您不能做很多事情-它会进行表格扫描。有一些解决方法(使用触发器构建您自己的索引),但是我怀疑您可以这样做-这非常复杂。附加索引表将必须包含所有可能的单词组合,并减少首字母(即,无,第一,第二等),以使其易于使用。您成功地达到了SQL Server的弱点。确保查询或连接参数不会留下过多的锁。所有你能做的。