Хранимая процедура с SELECT и NULLS

#sql #sql-server #select #stored-procedures

#sql #sql-сервер #выберите #хранимые процедуры

Вопрос:

У меня есть следующая хранимая процедура:

 ALTER PROCEDURE [dbo].[SearchProfile]

(
@Type varchar,
@Name varchar
)

AS
SELECT * 
FROM dbo.Profiles 
WHERE ((@Type IS NULL) 
 OR (dbo.Profiles.Type = @Type)) 
 AND  ((@Name IS NULL) 
 OR (Name = @Name));
  

Когда я выполняю это с:

 exec SearchProfile NULL, NULL
  

Она возвращает все строки, которые в порядке, но когда я меняю одно из значений NULL на некоторое значение…

 exec SearchProfile 'abc', NULL
  

Она ничего не возвращает.

Что я делаю не так? Заранее спасибо.

Комментарии:

1. Вы должны указать длины для этих параметров varchar — я подозреваю, что, поскольку это опущено, параметры имеют размер всего 1 символ.

2. Вредные привычки, от которых следует отказаться: объявление VARCHAR без (length) — вы должны всегда указывать длину для любых varchar переменных и параметров, которые вы используете

Ответ №1:

Вам нужно указать длину переменных.

Если вы запустите

 DECLARE @Type varchar = 'abc'

SELECT @Type
  

Она возвращает

 a
  

Поэтому измените ее на что-то вроде

 @Type varchar(50),
@Name varchar(50)
  

ДЕМОНСТРАЦИЯ SQL Fiddle