Объединить строку запроса в процедуре с оператором case с параметром - PullRequest
0 голосов
/ 27 сентября 2019

Мне нужно добавить ниже выбранный набор запросов с другим набором запросов на основе условия

    DECLARE @queryString VARCHAR(1000);
    -- Insert statements for procedure here
    Set @queryString ='SELECT 
                CASE 
                                WHEN d.sno IS NOT NULL THEN 'y'
                                ELSE NULL 
                END 
                amendment_type, 
                u.user_login_id [User], 
                role_name [Role], 
                u.user_name [Name], 
                a.companyname        +':<br>('+b.branch+')' [Agent/Branch], 
                u.last_login_pc+'('+u.ip_address+')<br> Login Time: '+cast(u.last_login AS varchar(50)) [Last Login], 
                u.lock_status [Lock/Unlock], 

                CASE 
                                WHEN u.lock_status='y' THEN 'Locked - '+ u.lock_by
                                WHEN datediff(d,u.last_login,getdate())>u.lock_days 
                                AND             isnull(u.lock_days,0)>0 THEN 'Locked - Day Exceed'
                                WHEN u.active_session IS NULL 
                                AND             isnull(u.lock_status,'n')='n' THEN 'Not Login'
                                ELSE 'Active'
                END 
                [Status], 
                u.*, 
                a.agentcan, 
                b.branch, 
                b.branchcodechar, 
                NULL branchcan
FROM            agentsub u 
JOIN            agentbranchdetail b 
ON              u.agent_branch_code=b.agent_branch_code 
JOIN            agentdetail a 
ON              b.agentcode=a.agentcode
LEFT OUTER JOIN application_role_agent_user r 
ON              u.user_login_id=r.user_id 
LEFT OUTER JOIN application_role p 
ON              r.role_id=p.role_id 
LEFT OUTER JOIN agentsub_amendment d 
ON              d.agent_user_id=u.agent_user_id
WHERE           1=1'

IF (@loginId !=null)
BEGIN
 SET @queryString =@queryString + 'and u.user_login_id like ('+ @loginId +')'
END


SET @queryString =@queryString +'order by u.user_login_id,a.companyname,b.branch'

EXEC @queryString 

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

@ uberbloke является правильным в отношении длины запроса.

EXEC sp_executesql с несколькими параметрами ссылка дает решение для dynamic query до pass parameter values.

Пожалуйста, проверьте нижеобновленный код запроса.

DECLARE @queryString NVARCHAR(MAX);

    -- Insert statements for procedure here
Set @queryString =
    'SELECT 
        CASE 
            WHEN d.sno IS NOT NULL THEN ''y''
            ELSE NULL 
        END 
        amendment_type, 
        u.user_login_id [User], 
        role_name [Role], 
        u.user_name [Name], 
        a.companyname + '':<br>('' + b.branch) [Agent/Branch], 
        u.last_login_pc + ''('' + u.ip_address + '')<br> Login Time: '' + cast(u.last_login AS varchar(50)) + '' [Last Login], 
        u.lock_status [Lock/Unlock], 
        CASE 
            WHEN u.lock_status = ''y'' THEN ''Locked - '' + u.lock_by
            WHEN datediff(d,u.last_login,getdate()) > u.lock_days AND (u.lock_days,0) > 0 THEN ''Locked - Day Exceed''
            WHEN u.active_session IS NULL AND isnull(u.lock_status,''n'') = ''n'' THEN ''Not Login''
            ELSE ''Active''
        END [Status], 
        u.*, 
        a.agentcan, 
        b.branch, 
        b.branchcodechar, 
        NULL branchcan
    FROM agentsub u 
    JOIN agentbranchdetail b ON u.agent_branch_code = b.agent_branch_code 
    JOIN agentdetail a ON b.agentcode = a.agentcode
    LEFT OUTER JOIN application_role_agent_user r ON u.user_login_id = r.user_id
    LEFT OUTER JOIN application_role p ON r.role_id = p.role_id
    LEFT OUTER JOIN agentsub_amendment d ON d.agent_user_id = u.agent_user_id
    WHERE 1 = 1 '

IF (@loginId !=null)
BEGIN
    SET @queryString = @queryString + 'and u.user_login_id like ('+ @loginId + ')'
END

SET @queryString = @queryString + ' order by u.user_login_id,a.companyname,b.branch'

EXEC sp_executesql @queryString
0 голосов
/ 27 сентября 2019

Первый ... Ваш запрос в его нынешнем виде (через блокнот ++) состоит из 1731 символа, поэтому он не помещается в varchar (1000)

Второй ... Вам необходимо решить некоторые проблемы с помощью запроса;например,

WHEN d.sno IS NOT NULL THEN 'y'

, вероятно, должно быть

WHEN d.sno IS NOT NULL THEN ''y''

Третье ... Google / исследовать sp_executesql и параметры

Наконец ... как говорит @Panagiotis Kanavos, Не ничего объединять (см. Третий ...);вам нужно посмотреть "sql инъекция"

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