Это может быть только я, но использование одной переменной для представления двух разных полей дает мне ложные советы. Я бы переписал эту хранимую процедуру так, чтобы она принимала две разные переменные, которые можно обнулять (одну int, CustomerID и одну varchar, CustomerName). Это будет выглядеть так:
CREATE PROCEDURE [dbo].[uspGetCustomer] (
@CustomerID int = null,
@CustomerName VARCHAR(100) = null)
AS
IF @CustomerID IS NOT NULL BEGIN
SELECT * FROM Customers WHERE CustomerID = @CustomerID
END ELSE IF @CustomerName IS NOT NULL BEGIN
SELECT * FROM Customers WHERE CustomerName LIKE @CustomerName
END ELSE
--error handling, return empty set maybe?
END
Если это просто не вариант, вы все равно можете использовать:
CREATE PROCEDURE [dbo].[uspGetCustomer] (@Customer VARCHAR(100))
AS
DECLARE @NameMatch;
IF ISNUMERIC(@Customer) = 1 BEGIN
SELECT * FROM Customers WHERE CustomerID = CAST (@Customer AS int)
END ELSE BEGIN
SET @NameMatch = '%' + @Customer + '%'
SELECT * FROM Customers WHERE CustomerName LIKE @NameMatch
END