Поиск в том или ином поле в зависимости от того, что я передаю? - PullRequest
0 голосов
/ 24 января 2012

Я пытаюсь написать хранимые процедуры в SQL Server 2008. Мне нужно получить пользователя (все столбцы в dbo.UserDetails) по UserId (идентификатор пользователя происходит из другой таблицы (dbo.UserSubjects)) и UserName (который приходит из dbo.UserDetails). У меня всегда будет идентификатор пользователя, но не всегда имя пользователя.

Так что теперь на мой вопрос, как я могу написать хранимые процедуры, которые, если Имя пользователя пусто, запрос будет искать только по ИД пользователя, а если имя пользователя не пусто запрос будет искать с UserId и UserName

Пока я написал:

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[GetUserBySubjectID](@ID int = NULL, @Name string)
AS
SET     NOCOUNT ON
BEGIN   TRY
    IF  @ID IS NULL
            RAISERROR   400001 'User with given Subject ID does not exist'

ELSE
BEGIN
    SELECT  UD.*                
    FROM    dbo.UserDetails UD , dbo.UserSubjects US
    WHERE   US.UserID = UD.UserID and US.SubjectID = @ID and UD.UserName = @Name 

    IF  @@ROWCOUNT = 0
        RAISERROR   400001 'User with given ID does not exist'
END
RETURN  0
END     TRY
BEGIN   CATCH
    EXEC    dbo.GetErrorInfo
    RETURN  1
END     CATCH

1 Ответ

0 голосов
/ 25 января 2012

Просто добавьте еще один оператор IF в ваш код, чтобы проверить, является ли @Name НЕДЕЙСТВИТЕЛЬНЫМ:

IF @Name IS NULL
BEGIN
 ...
 WHERE US.UserID = UD.UserID and US.SubjectID = @ID
 ...
END
ELSE
BEGIN
 ...
 WHERE  US.UserID = UD.UserID and US.SubjectID = @ID and UD.UserName = @Name 
 ... 

Может показаться, что написание повторяющегося кода, но это будет работать намного лучше, чем написание динамического предложения WHERE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...