хранимая процедура с isnull(выражение, замена) ничего не возвращает

У меня есть хранимая процедура, которая принимает параметр и возвращает кортеж с соответствующими значениями. Если параметр не передан, вернуть каждый кортеж в таблице

create procedure getScore
(
    @clinicCode varchar = null,
)
as
begin
    select * from myTable
    where ClinicCode = isnull(@clinicCode, ClinicCode)
end

поэтому я выполняю это

exec getScore
exec getScore 'PSH'

оба они не возвращают кортеж. Я попытался выбрать * из myTable, и они вернули все кортежи. Не уверен, почему оператор из ... isnull(expression, replace) запутался


person kaboom    schedule 12.03.2014    source источник
comment
Вредные привычки: объявление VARCHAR без (длины) — вы должны всегда указывать длину для любых varchar переменных и параметров, которые вы используете   -  person marc_s    schedule 12.03.2014


Ответы (1)


Вам нужно изменить декларацию

@clinicCode varchar = null,

до фактического размера, который вам нужен.

Так что-то вроде

@clinicCode varchar(50) = null,

Причина этого в том, что

@clinicCode varchar

такой же как

@clinicCode varchar(1)

Что затем приводит ваше поле isnull(@clinicCode, ClinicCode) только к первой букве ClinicCode

Взгляните на этот пример

ДЕМО-версия скрипта SQL

person Adriaan Stander    schedule 12.03.2014