Необязательные параметры в хранимой процедуре SQL - PullRequest
2 голосов
/ 08 апреля 2011

Я пытаюсь создать хранимую процедуру с необязательными параметрами.Я следовал инструкциям, перечисленным здесь .Я также ссылался на этот ТАК вопрос .Однако я продолжаю получать следующую ошибку:

Ошибка преобразования типа данных varchar в int.

Это работает, когда я выполняю его как

EXEC sp_get_user {id#}

или

EXEC sp_get_user NULL, {username}

, но не с

EXEC sp_get_user {username}

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

@id int = NULL,
@username nvarchar(50) = NULL

SELECT
    username = COALESCE(a.Username, b.Username),
    password = COALESCE(a.Password, b.Password),
    signup_date = COALESCE(a.SignedUpOn, b.Signup_Date)
FROM table1 a
FULL OUTER JOIN table 2 b
ON a.ID = b.ID
WHERE ((a.ID = @id OR @id IS NULL)
AND (a.Username = @username OR @username IS NULL)
OR (b.ID = @id OR @id IS NULL)
AND (b.Username = @username OR @username IS NULL))

Я попытался добавить OPTION(RECOMPILE) и не получилуспех.Я хочу сделать это динамичным, чтобы другие разработчики могли вызывать этот SP без необходимости каждый раз указывать все параметры.Они будут подключаться через LINQ, если это имеет значение.

Ответы [ 3 ]

5 голосов
/ 08 апреля 2011

используйте именованные параметры в этом случае

EXEC sp_get_user @username = {username}

, если оба параметра являются необязательными, сервер SQL будет перемещаться по позиции, поэтому первый передаваемый вами параметр будет сопоставлен с первым в процедуре

4 голосов
/ 08 апреля 2011

При выполнении хранимых процедур вы должны соответствовать порядку параметров, как определено соответственно, поэтому первое и второе операторы работают нормально, в первом EXEC sp_get_user {id#} вы передали идентификатор и проигнорировали имя пользователя, затем он принимаетопределенное значение по умолчанию.Более того, во втором операторе EXEC sp_get_user NULL, {username} вы указали значение NULL для идентификатора и передали значение для параметра имени пользователя, поэтому он также работает.

С другой стороны, третий EXEC sp_get_user {username} не делаетЭто не работает, потому что SQL Server рассматривал ваш параметр {username} как значение id, поэтому он пытается преобразовать его в целое число и, конечно, он потерпит неудачу.Вместо этого вам нужно указать имя параметра, когда вы передаете его значение, см. Следующий код:

EXEC sp_get_user @username = {username}
3 голосов
/ 08 апреля 2011

Ну да, очевидно, ваша последняя попытка потерпит неудачу.

Ваш сохраненный процесс ожидает два параметра в следующем порядке:

  1. @id INT
  2. @username NVARCHAR(50)

Если вы просто вызовите свою хранимую процедуру с одним параметром, тогда этот параметр будет сопоставлен с @id - и, следовательно, он должен быть INT.

Если вы хотите вызвать ваш сохраненный процесс только с одним значением для имени пользователя, вам нужно будет использовать с именем параметр - вы не можете полагаться на позицию (так как первый и единственный параметр всегда будет совпадатьдо @id)

EXEC sp_get_user @username = {username}
...