SQL搜索基于对多个列比较关键字,但避免转换错误

SQL搜索基于对多个列比较关键字,但避免转换错误,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有这样一个SQL语句 declare @keyword varchar(100)='ndee' select ISNUMERIC(@keyword) select * from teststaken where ( (firstname like '%' + @keyword + '%') or (lastname like '%' + @keyword + '%') or TestTakerEmail like '%' + @keyword + '%' or

我有这样一个SQL语句

declare @keyword varchar(100)='ndee'
select ISNUMERIC(@keyword)

select * from teststaken where ( 
   (firstname like '%' + @keyword + '%') or  
   (lastname like '%' + @keyword + '%') or  
    TestTakerEmail like '%' + @keyword + '%' or 
   (ISNUMERIC(@keyword)=1 and TestsTakenID = @keyword)
)
它只是一个搜索查询,用于根据针对不同列给出的关键字选择行。但是teststakenID列是整数。因此,如果我们在给定字符串时避免最后一次比较,就可以了。如果给定一个字符串或单词,它将抛出一个错误

将varchar值“andee”转换为数据时,转换失败 输入int

但我试图完成的是检查关键字是否为integer类型,并且只检查integer类型,然后与teststakenid列进行比较。请帮我找出我做错了什么

试试这个:

declare @keyword varchar(100)='ndee'

select * 
from teststaken 
where firstname like '%' + @keyword + '%' 
or lastname like '%' + @keyword + '%' 
or TestTakerEmail like '%' + @keyword + '%' 
or cast(TestsTakenID as varchar(100)) = @keyword
说明: 出现此异常是因为Sql server尝试评估where子句中的每个条件,即使它位于
关键字之后(与使用
&&
时的c#或使用
时的vb.net不同)。
这导致尝试将
TestsTakenID
的int值计算为
@关键字的varchar值

由于只要长度足够,任何整数值都可以转换为varchar值,因此您只需将
TestsTakenID
强制转换为varchar(100)(因为它是参数的长度)。一旦我们这样做了,就真的没有必要像paul在评论中正确地写道的那样进行
ISNUMERIC
测试了。

多亏了这些评论,我今天学到了:-)。

@LittleBobbyTables
(isnumeric(@keyword)=1和cast(@keyword as int)=TestsTakenID)
对于me@paul-好吧,那是什么废话。基于,我总是觉得SQL Server在
CASE
表达式之外没有做短路,但我测试了SQL示例,并收回了我以前的语句。对此感到非常惊讶。要么SQL Server中发生了一些变化,要么我不希望这是可靠的一致性。@Zohar-这就是我怀疑自己的原因。参见我对保罗的回复中的链接;在SQL Server中不能总是保证短路,您可以在SQL FIDLE中看到这一点。另请参阅SQL Server特定的问题和答案。如果是这样,我可能应该回滚我的编辑:-)顺便说一句,我喜欢你的用户名。我总是用一个妈妈的
漏洞作为解释sql注入攻击的链接。@ZoharPeled-eeyup:)