2014-12-23 4 views
0

У меня есть хранимая процедура, в которой мне нужно сравнить значения, используя =, <, > в качестве параметра и сравнить его с другим значением значения параметра, который имеет значение 1,2,3, 4,5, но не знаю, как это сделать, пожалуйста, помогите.Динамический запрос хранимой процедуры с if

Вот моя хранимая процедура, что я пытался до сих пор, и у меня есть три таблицы user, RatingReview и accounttype:

Create Procedure searchsp_LenderSearch 
    @pAccountTypeId int =null, 
    @pFirstName varchar(25)=null, 
    @pLastName varchar(35)=null, 
    @pZip varchar(10)=null, 
    @pOperator varchar(2)=null, 
    @pRating varchar(2)=null 
AS 
BEGIN 

    SET NOCOUNT ON; 
Declare @SQLQuery AS NVarchar(4000) 
    SET @SQLQuery= 
    'select 
    at.AccountName, 
    U.UserId, 
    U.FirstName, 
    U.LastName, 
    U.NMLS, 
    U.[Address], 
    U.PrimaryEmailId As Office, 
    U.AdditionalEmail As Personal, 
    U.DirectPhone As Work, 
    U.Mobile, 
    R.RatingStar 

    from [User] U 
    left outer join RatingReview R on R.UserId =U.UserId 
    left outer join AccountType at on at.AccountTypeId = U.AccountTypeId 
    where U.Deleted =0 
    AND at.AccountTypeId = '+CAST(@pAccountTypeId as Varchar(10))+' 
    AND U.FirstName = ''' + @pFirstName + ''' 
    AND U.LastName = ''' + @pLastName + ''' 
    AND U.Zip = ''' + @pZip + ''' 
    AND R.RatingStar = ''' + @pRating + '''' 


IF(@pAccountTypeId !=null OR @pAccountTypeId != '') 

    BEGIN 
     SET @[email protected]+' AND at.AccountTypeId='+CONVERT(VARCHAR, @pAccountTypeId) 
    END 

    IF(@pFirstName !=null OR @pFirstName != '') 
    BEGIN 
     SET @[email protected]+' AND U.FirstName Like ''%' + @pFirstName + '%''' 
    END 

    IF(@pLastName !=null OR @pLastName != '') 
    BEGIN 
     SET @[email protected]+' AND U.LastName Like ''%' + @pLastName + '%''' 
    END 

    IF(@pZip !=null OR @pZip != '') 
    BEGIN 
     SET @[email protected]+' AND U.Zip Like ''%' + @pZip + '%''' 
    END 

    IF(@pRating !=null OR @pRating != '') 
    BEGIN 
     SET @[email protected]+' AND R.RatingStar Like ''%' + @pRating + '%''' 
    END 

    IF(@pOperator = '=') 
    BEGIN 
    SET @SQLQuery += ' AND R.RatingStar = ' + CAST(@pRating AS NVARCHAR(5)) + '' 
    END 

    IF(@pOperator = '>') 
     BEGIN 
     SET @SQLQuery += ' AND R.RatingStar > ' + CAST(@pRating AS NVARCHAR(5)) + '' 
     END 

    IF(@pOperator = '<') 
     BEGIN 
     SET @SQLQuery += ' AND R.RatingStar < ' + CAST(@pRating AS NVARCHAR(5)) + '' 
     END 
     SET @[email protected]+ 
    'group by 
    at.AccountName, 
    U.UserId, 
    U.FirstName, 
    U.LastName, 
    U.NMLS, 
    U.[Address], 
    U.PrimaryEmailId, 
    U.AdditionalEmail, 
    U.DirectPhone, 
    U.Mobile, 
    R.RatingStar' 

    EXEC (@SQLQuery) 
END 

ответ

1

Вам нужно бежать параметры, которые проходят в запрос, чтобы объединить их в @sqlstring переменная. Попробуйте этот запрос:

Create PROCEDURE searchsp_LenderSearch 
    @pAccountType int, 
    @pFirstName varchar(25), 
    @pLastName varchar(35), 
    @pZip varchar(10), 
    @pOperator varchar(2), 
    @pRating int 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @SQLQuery AS NVarchar(4000) 
    SET @SQLQuery = ' 
SELECT 
    at.AccountTypeId, 
    U.UserId, 
    U.FirstName, 
    U.LastName, 
    R.RatingStar AS Rating, 
    U.NMLS, 
    U.[Address], 
    U.PrimaryEmailId As Office, 
    U.AdditionalEmail As Personal, 
    U.DirectPhone As Work, 
    U.Mobile 
FROM [User] U 
LEFT OUTER JOIN RatingReview R ON R.UserId = U.UserId 
LEFT OUTER JOIN AccountType at ON at.AccountTypeId = U.AccountTypeId 
WHERE U.Deleted = 0 
    AND at.AccountTypeId = 1 
    AND U.FirstName = ''' + @pFirstName + ''' 
    AND U.LastName = ''' + @pLastName + ''' 
    AND U.Zip = ''' + @pZip + '''' 

IF(@pOperator = '=') 
    BEGIN 
    SET @SQLQuery += ' AND r.ratingstar = ' + CAST(@pRating AS NVARCHAR(5)) + '' 
    END 
IF(@pOperator = '<') 
    BEGIN 
    SET @SQLQuery += ' AND r.ratingstar < ' + CAST(@pRating AS NVARCHAR(5)) + '' 
    END 
IF(@pOperator = '>') 
    BEGIN 
    SET @SQLQuery += ' AND r.ratingstar > ' + CAST(@pRating AS NVARCHAR(5)) + '' 
    END 

SET @SQLQuery += ' 
GROUP BY 
    at.AccountTypeId, 
    U.UserId, 
    U.FirstName, 
    U.LastName, 
    U.NMLS, 
    U.[Address], 
    U.PrimaryEmailId, 
    U.AdditionalEmail, 
    U.DirectPhone, 
    U.Mobile, 
    R.RatingStar' 
EXEC (@SQLQuery) 
END 

Код выше будет генерировать запрос типа:

SELECT 
    at.AccountTypeId, 
    U.UserId, 
    U.FirstName, 
    U.LastName, 
    R.RatingStar AS Rating, 
    U.NMLS, 
    U.[Address], 
    U.PrimaryEmailId As Office, 
    U.AdditionalEmail As Personal, 
    U.DirectPhone As Work, 
    U.Mobile 
FROM [User] U 
LEFT OUTER JOIN RatingReview R ON R.UserId = U.UserId 
LEFT OUTER JOIN AccountType at ON at.AccountTypeId = U.AccountTypeId 
WHERE U.Deleted = 0 
    AND at.AccountTypeId = 1 
    AND U.FirstName = 'John' 
    AND U.LastName = 'Adams' 
    AND U.Zip = '100AA' AND r.ratingstar > 1 
GROUP BY 
    at.AccountTypeId, 
    U.UserId, 
    U.FirstName, 
    U.LastName, 
    U.NMLS, 
    U.[Address], 
    U.PrimaryEmailId, 
    U.AdditionalEmail, 
    U.DirectPhone, 
    U.Mobile, 
    R.RatingStar 

, если выполнены как exec searchsp_LenderSearch 1, 'John', 'Adams', '100AA', '>',1

Я думаю, что это то, что вы хотите. Очевидно, что вы можете добавить некоторые проверки ошибок и проверки параметров и т.д.

В соответствии с поручением здесь обновленная версия запроса изменен, чтобы соответствовать обновленный вопрос:

Create Procedure searchsp_LenderSearch 
    @pAccountTypeId int  = null, 
    @pFirstName varchar(25) = null, 
    @pLastName  varchar(35) = null, 
    @pZip   varchar(10) = null, 
    @pOperator  varchar(2) = null, 
    @pRating  varchar(2) = null 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @SQLQuery AS NVarchar(4000) 
    SET @SQLQuery =' 
SELECT 
    at.AccountName, 
    U.UserId, 
    U.FirstName, 
    U.LastName, 
    U.NMLS, 
    U.[Address], 
    U.PrimaryEmailId As Office, 
    U.AdditionalEmail As Personal, 
    U.DirectPhone As Work, 
    U.Mobile, 
    R.RatingStar 
FROM [User] U 
LEFT OUTER JOIN RatingReview R ON R.UserId = U.UserId 
LEFT OUTER JOIN AccountType at ON at.AccountTypeId = U.AccountTypeId 
WHERE U.Deleted = 0 
' 
IF(@pAccountTypeId !=null OR @pAccountTypeId != '') 
    BEGIN 
     SET @SQLQuery += ' AND at.AccountTypeId = '+CONVERT(VARCHAR(10), @pAccountTypeId) + '' 
    END 

IF(@pFirstName !=null OR @pFirstName != '') 
    BEGIN 
     SET @SQLQuery += ' AND U.FirstName Like ''%' + @pFirstName + '%''' 
    END 

IF(@pLastName !=null OR @pLastName != '') 
    BEGIN 
     SET @SQLQuery += ' AND U.LastName Like ''%' + @pLastName + '%''' 
    END 

IF(@pZip !=null OR @pZip != '') 
    BEGIN 
     SET @SQLQuery += ' AND U.Zip Like ''%' + @pZip + '%''' 
    END 

IF(@pOperator = '=') 
    BEGIN 
     SET @SQLQuery += ' AND R.RatingStar = ' + CAST(@pRating AS NVARCHAR(5)) + '' 
    END 

IF(@pOperator = '>') 
    BEGIN 
     SET @SQLQuery += ' AND R.RatingStar > ' + CAST(@pRating AS NVARCHAR(5)) + '' 
    END 

IF(@pOperator = '<') 
    BEGIN 
     SET @SQLQuery += ' AND R.RatingStar < ' + CAST(@pRating AS NVARCHAR(5)) + '' 
    END 

SET @SQLQuery += ' 
GROUP BY 
    at.AccountName, 
    U.UserId, 
    U.FirstName, 
    U.LastName, 
    U.NMLS, 
    U.[Address], 
    U.PrimaryEmailId, 
    U.AdditionalEmail, 
    U.DirectPhone, 
    U.Mobile, 
    R.RatingStar' 

    EXEC (@SQLQuery) 
    --PRINT (@SQLQuery) 
END 
+0

Благодарю вас так много сэр @ JPW. он помогает много – Felixerity

+0

сэр при выполнении вышеуказанного условия exec searchsp_LenderSearch 1, 'John', 'Adams', '100AA', '=', 5 работает, но условие exec searchsp_LenderSearch 1, 'John', 'Adams', ' 100AA ','> ', 1 не работает. вы можете помочь мне на этом – Felixerity

+0

@ReshavChandanSingh. Как он не работает? – jpw

Смежные вопросы