2011-08-18 44 views
0

我有以下表“经理”(简体):MSSQL存储过程:用列比较参数,如果ISNUMERIC

ID, int 
Name, nvarchar(100) 

在有一个参数(“搜索”,类型为nvarchar)的存储过程,我想选择所有行上

  1. 通过ID列是完全@Search OR
  2. 的名称,列包含@Search。

此刻,我在存储过程中选择看起来是这样的:

SELECT ID, Name FROM Managers WHERE 
(ISNUMERIC(@Search) = 1 AND [ID] = CAST(@Search AS INT)) Or 
Contains([Name], @Search) 

如果我调用存储过程与@Search = 1321(例如),选择的作品。

但是,如果我有一个@Search参数不是数字(例如“HES”),我得到以下错误: 将nvarchar值'HES'转换为数据类型int时转换失败。

我该如何解决这个问题?

在此先感谢

Raphi

回答

0
SELECT ID, Name FROM Managers 
WHERE [ID] = CASE 
       WHEN ISNUMERIC(@Search) = 1 AND @Search NOT LIKE '%.%' THEN CAST(@Search AS INT) 
       ELSE -1 
      END 
OR Contains([Name], @Search) 
+0

谢谢你,就像一个魅力! :) –

+0

某些东西不起作用:如果参数是十进制值“132.4”,ISNUMERIC返回1,但CAST到INT失败。 –

+0

@raphael我更新了我的答案。 –