如何使用sql server减少存储过程的计时?

如何使用sql server减少存储过程的计时?,sql,windows,Sql,Windows,它执行的时间更长。如何缩短时间?在等待电子邮件时,我能够将其从动态查询内容中转换出来。每当您看到这样一个过滤器使用传入的字段时,9/10将总是更加高效地左外连接您的过滤器表并使用如下内容: CREATE Procedure SearchData ( @Lastname Varchar(250), @Firstname Varchar(25), @City varchar(50), @Address1 varchar(40), @HullID varchar(50), @State varchar

它执行的时间更长。如何缩短时间?

在等待电子邮件时,我能够将其从动态查询内容中转换出来。每当您看到这样一个过滤器使用传入的字段时,9/10将总是更加高效地左外连接您的过滤器表并使用如下内容:

CREATE Procedure SearchData ( @Lastname Varchar(250), @Firstname Varchar(25), @City varchar(50),
@Address1 varchar(40),
@HullID varchar(50),
@State varchar(50),
@Status varchar(15),
@Accountpk varchar(40),
@Agentpk varchar(1000),
@Issuecopk varchar(40),
@Productpk varchar(40), @UserType varchar(15), @UserID varchar(30) ) As Begin Set NOCOUNT ON

Declare @Selectionquery         As Varchar(8000)
Declare @USAquery               As Varchar(4000)
Declare @NonUSAquery            As Varchar(4000)
DECLARE @As_User_PK             Varchar(50)
DECLARE @TopRows                Varchar(50)
DECLARE @NONUSQueryColumns      Varchar(1000)
DECLARE @USQueryColumns         Varchar(1000)
DECLARE @QueryColumnsTemp       Varchar(1000)

DECLARE @errordesc varchar(max)

set @Selectionquery         = ''
set @USAquery               = ''
set @NonUSAquery            = ''
Set @NONUSQueryColumns      = ''
Set @USQueryColumns         = ''
Set @QueryColumnsTemp       = ''



Select  @TopRows = Parameter_NUMBER_1 
from    cl_parameters  
where   cl_parameter_code='CLIENTSEARCH' 

select  @As_User_PK = AS_User_PK 
from    as_users 
where   AS_User_ID = @UserID

Set @USQueryColumns = '
    SELECT  PM.POLICY_NO,
            PM.POLICY_STATUS_CODE,
            --MODIFIED BY SARATH FOR COMPATABILITY MODE ON JAN 15 2014
            --ltrim(rtrim(ltrim(rtrim(isnull(CL.first_name,'+''''+' '+''''+') + '+''''+' '+''''+'+ isnull(CL.middle_name,'+''''+''+''''+'))) + '+''''+' '+''''+ '+ CL.last_org_name)) as  last_org_name , 
            Replace(ltrim(rtrim(ltrim(rtrim(isnull(CL.first_name,'+''''+' '+''''+') + '+''''+' '+''''+'+ isnull(CL.middle_name,'+''''+''+''''+'))) + '+''''+' '+''''+ '+ CL.last_org_name)), ''&'', ''-'') as  LASTORGNAME , 
            Replace(CL.FULL_LEGAL_NAME, ''&'', ''-'') as FULL_LEGAL_NAME, 
            CA.ADDRESS_LINE1, 
            CA.TOWN_CITY + '+''''+' '+''''+' +  ISNULL(CLSTATE.STATE_NAME,CA.STATE_CODE), 
            CONVERT(VARCHAR(20), TERM.Term_Start_Date,101)+ '+''''+' - '+''''+' +CONVERT(VARCHAR(20),TERM.Term_End_Date,101),
            Replace(CLAGENT.LAST_ORG_NAME, ''&'', ''-'') as LAST_ORG_NAME, 
            (Select SCREEN_NAME from CL_CLIENT where CL_CLIENT_PK=PM.ISSUECO_CLIENT_FK), 
            PRODUCT.Screen_Name, 
            PM.PO_POLICY_MASTER_PK'

    Set @USAquery = '
            FROM    dbo.PO_POLICY_MASTER PM 
            INNER JOIN CL_CLIENT CL 
            ON      PM.OWNER_CLIENT_FK = CL.CL_CLIENT_PK'


Set @NONUSQueryColumns = '
    SELECT  PM.POLICY_NO,
            PM.POLICY_STATUS_CODE,
            --MODIFIED BY SARATH FOR COMPATABILITY MODE ON JAN 15 2014
            --ltrim(rtrim(ltrim(rtrim(isnull(CL.first_name,'+''''+' '+''''+') + '+''''+' '+''''+'+ isnull(CL.middle_name,'+''''+''+''''+'))) + '+''''+' '+''''+ '+ CL.last_org_name)) as  last_org_name , 
            Replace(ltrim(rtrim(ltrim(rtrim(isnull(CL.first_name,'+''''+' '+''''+') + '+''''+' '+''''+'+ isnull(CL.middle_name,'+''''+''+''''+'))) + '+''''+' '+''''+ '+ CL.last_org_name)), ''&'', ''-'') as  LASTORGNAME , 
            Replace(CL.FULL_LEGAL_NAME, ''&'', ''-'') as FULL_LEGAL_NAME,
            CA.ADDRESS_LINE1, 
            CA.TOWN_CITY + '+''''+' '+''''+' +  ISNULL(CA.STATE_CODE,'+''''+''+''''+'), 
            CONVERT(VARCHAR(20), TERM.Term_Start_Date,101)+ '+''''+' - '+''''+' +CONVERT(VARCHAR(20),TERM.Term_End_Date,101),
            Replace(CLAGENT.LAST_ORG_NAME, ''&'', ''-'') as LAST_ORG_NAME, 
            (Select SCREEN_NAME from CL_CLIENT where CL_CLIENT_PK=PM.ISSUECO_CLIENT_FK), 
            PRODUCT.Screen_Name, 
            PM.PO_POLICY_MASTER_PK'
Set @NonUSAquery = '
    FROM    dbo.PO_POLICY_MASTER PM 
    INNER JOIN CL_CLIENT CL 
    ON      PM.OWNER_CLIENT_FK = CL.CL_CLIENT_PK'

IF ISNULL(@Lastname,'') <> ''
    BEGIN
        SET @USAquery   = @USAquery + ' INNER JOIN CL_Client_Name ON CL.CL_CLIENT_PK = CL_CLIENT_NAME.CL_CLIENT_FK'
        SET @USAquery = @USAquery + ' AND UPPER(CL_CLIENT_NAME.LAST_ORG_NAME_UCASE) LIKE UPPER('
        SET @USAquery = @USAquery + ''''+ @Lastname + '%'+ ''''+')'
        SET @NonUSAquery = @NonUSAquery + ' INNER JOIN CL_Client_Name ON CL.CL_CLIENT_PK = CL_CLIENT_NAME.CL_CLIENT_FK'
        SET @NonUSAquery = @NonUSAquery + ' AND UPPER(CL_CLIENT_NAME.LAST_ORG_NAME_UCASE) LIKE UPPER('
        SET @NonUSAquery = @NonUSAquery + ''''+ @Lastname + '%'+ ''''+')'
    END
IF ISNULL(@Firstname,'') <> ''
    BEGIN
        IF ISNULL(@Lastname,'') = ''
            BEGIN
                SET @USAquery   = @USAquery + ' INNER JOIN CL_Client_Name ON CL.CL_CLIENT_PK = CL_CLIENT_NAME.CL_CLIENT_FK '
                SET @USAquery = @USAquery + '  AND UPPER(CL_CLIENT_NAME.FIRST_NAME_UCASE) LIKE UPPER('
                SET @USAquery = @USAquery + ''''+ @Firstname + '%'+ ''''+')'
                SET @NonUSAquery = @NonUSAquery + ' INNER JOIN CL_Client_Name ON CL.CL_CLIENT_PK = CL_CLIENT_NAME.CL_CLIENT_FK '
                SET @NonUSAquery = @NonUSAquery + '  AND UPPER(CL_CLIENT_NAME.FIRST_NAME_UCASE) LIKE UPPER('
                SET @NonUSAquery = @NonUSAquery + ''''+ @Firstname + '%'+ ''''+')'
            END
        ELSE
            BEGIN
                SET @USAquery = @USAquery + ' AND UPPER(CL_CLIENT_NAME.FIRST_NAME_UCASE) LIKE UPPER('
                SET @USAquery = @USAquery + ''''+ @Firstname + '%'+ ''''+')'
                SET @NonUSAquery = @NonUSAquery + ' AND UPPER(CL_CLIENT_NAME.FIRST_NAME_UCASE) LIKE UPPER('
                SET @NonUSAquery = @NonUSAquery + ''''+ @Firstname + '%'+ ''''+')'
            END
    END
/* Commented by JB to address the issue that the default adress is billing address hence the policy is not getting diaplayed
SET @USAquery = @USAquery + ' INNER JOIN CL_ADDRESS CA ON CL.CL_CLIENT_PK = CA.CL_CLIENT_FK and CA.Address_Type_Code = ''MAILING'' AND ISNULL(IS_USA,'+''''+'N'+''''+') = '+''''+'Y'+''''+'' */

SET @USAquery = @USAquery + ' INNER JOIN CL_ADDRESS CA ON CL.CL_CLIENT_PK = CA.CL_CLIENT_FK AND ISNULL(IS_USA,'+''''+'N'+''''+') = '+''''+'Y'+''''+''
SET @USAquery = @USAquery + ' INNER JOIN CL_Role_Client crc ON cl.CL_Client_PK = crc.Role_Client_FK AND crc.Source_FK = pm.PO_Policy_Master_PK AND  crc.Role_Type_Code = ''POLICY'' AND crc.Role_Address_FK = ca.CL_Address_PK '
/* Commented by JB to address the issue that the default adress is billing address hence the policy is not getting diaplayed
SET @NonUSAquery = @NonUSAquery + ' INNER JOIN CL_ADDRESS CA ON CL.CL_CLIENT_PK = CA.CL_CLIENT_FK and CA.Address_Type_Code = ''MAILING'' AND ISNULL(IS_USA,'+''''+'N'+''''+') = '+''''+'N'+''''+'' */ SET @NonUSAquery = @NonUSAquery + ' INNER JOIN CL_ADDRESS CA ON CL.CL_CLIENT_PK = CA.CL_CLIENT_FK AND ISNULL(IS_USA,'+''''+'N'+''''+') = '+''''+'N'+''''+''
SET @NonUSAquery = @NonUSAquery + ' INNER JOIN CL_Role_Client crc ON cl.CL_Client_PK = crc.Role_Client_FK AND crc.Source_FK = pm.PO_Policy_Master_PK AND crc.Role_Type_Code = ''POLICY'' AND crc.Role_Address_FK = ca.CL_Address_PK '

IF ISNULL(@City,'') <> ''
    BEGIN
        SET @USAquery = @USAquery + '  AND UPPER(CA.TOWN_CITY) LIKE UPPER('
        SET @USAquery = @USAquery + ''''+ @City + '%'+ ''''+')'
        SET @NonUSAquery = @NonUSAquery + '  AND UPPER(CA.TOWN_CITY) LIKE UPPER('
        SET @NonUSAquery = @NonUSAquery + ''''+ @City + '%'+ ''''+')'
    END
SET @USAquery = @USAquery + ' INNER JOIN PO_RISK_MASTER RISK ON RISK.PO_POLICY_MASTER_FK = PM.PO_POLICY_MASTER_PK'

SET @NonUSAquery = @NonUSAquery + ' INNER JOIN PO_RISK_MASTER RISK ON RISK.PO_POLICY_MASTER_FK = PM.PO_POLICY_MASTER_PK'

IF ISNULL(@Address1,'') <> ''
    BEGIN
        SET @USAquery = @USAquery + '  AND UPPER(CA.ADDRESS_LINE1) LIKE UPPER('
        SET @USAquery = @USAquery + ''''+ '%' + @Address1 + '%'+ ''''+')'
        SET @NonUSAquery = @NonUSAquery + '  AND UPPER(CA.ADDRESS_LINE1) LIKE UPPER('
        SET @NonUSAquery = @NonUSAquery + ''''+ '%' + @Address1 + '%'+ ''''+')'
    END
IF ISNULL(@HullID,'') <> ''
    BEGIN
        SET @USAquery = @USAquery + '  AND UPPER(RISK.RISK_EXTERNAL_ID) LIKE UPPER('
        SET @USAquery = @USAquery + ''''+ '%' + @HullID + '%'+ ''''+')'
        SET @NonUSAquery = @NonUSAquery + '  AND UPPER(RISK.RISK_EXTERNAL_ID) LIKE UPPER('
        SET @NonUSAquery = @NonUSAquery + ''''+ '%' + @HullID + '%'+ ''''+')'
    END
SET @USAquery = @USAquery + ' INNER JOIN CL_COUNTRY_STATE CLSTATE ON CA.Country_Code = CLSTATE.CL_Country_Code AND CLSTATE.STATE_CODE = CA.STATE_CODE'
IF ISNULL(@State,'') <> ''
    BEGIN
        SET @USAquery = @USAquery + ' AND UPPER(CLSTATE.STATE_NAME) LIKE UPPER('
        SET @USAquery = @USAquery + ''''+ @State + '%'+ ''''+')'
        SET @NonUSAquery = @NonUSAquery + ' AND UPPER(CA.STATE_CODE) LIKE UPPER('
        SET @NonUSAquery = @NonUSAquery + ''''+ @State + '%'+ ''''+')'
    END
SET @USAquery = @USAquery + ' 
INNER JOIN PO_TERM_MASTER TERM 
ON      TERM.PO_POLICY_MASTER_FK = PM.PO_POLICY_MASTER_PK 
AND     TERM.PO_TERM_MASTER_PK = (SELECT    max(po_term_master_pk) 
                                    FROM    PO_TERM_MASTER 
                                    WHERE   PO_TERM_MASTER.PO_POLICY_MASTER_FK = PM.po_policy_master_PK) 
LEFT OUTER JOIN PA_ACCOUNT_MASTER ACCT 
ON      ACCT.pa_account_master_pk = PM.PO_AGENT_ACCOUNT_FK 
LEFT OUTER JOIN CL_CLIENT CLAGENT   
ON      CLAGENT.cl_client_pk = ACCT.owner_client_fk 
INNER JOIN PR_PRODUCT PRODUCT 
ON      PRODUCT.PR_PRODUCT_PK = PM.PR_PRODUCT_FK 
WHERE   1=1 and PRODUCT.PR_Product_Code <> ''BBRENTAL'' '

SET @NonUSAquery = @NonUSAquery + ' 
INNER JOIN PO_TERM_MASTER TERM 
ON      TERM.PO_POLICY_MASTER_FK = PM.PO_POLICY_MASTER_PK 
AND     TERM.PO_TERM_MASTER_PK = (SELECT    max(po_term_master_pk) 
                                    FROM    PO_TERM_MASTER 
                                    WHERE   PO_TERM_MASTER.PO_POLICY_MASTER_FK = PM.po_policy_master_PK) 
LEFT OUTER JOIN PA_ACCOUNT_MASTER ACCT 
ON      ACCT.pa_account_master_pk = PM.PO_AGENT_ACCOUNT_FK 
LEFT OUTER JOIN CL_CLIENT CLAGENT   
ON      CLAGENT.cl_client_pk = ACCT.owner_client_fk 
INNER JOIN PR_PRODUCT PRODUCT 
ON      PRODUCT.PR_PRODUCT_PK = PM.PR_PRODUCT_FK 
WHERE   1=1 and PRODUCT.PR_Product_Code <> ''BBRENTAL'' '

IF ISNULL(@Status,'') <> ''
    BEGIN
        IF ISNULL(@Status,'') <> 'ALL'
            BEGIN
                IF      ISNULL(@Status,'') = 'Quote'
                    BEGIN
                        SET @USAquery = @USAquery + 
                        ' AND   exists(
                                select  0
                                from    dbo.po_transaction pot
                                where   pot.po_policy_master_fk = pm.po_policy_master_pk
                                and     pot.pr_tran_type_code = ''NEWBUSINESS''
                                and     pot.transaction_cycle_code not in (''BOUND'',''VOIDED'',''ISSUED'',''BINDEREXPIRED''))'

                        SET @NonUSAquery = @NonUSAquery + 
                        ' AND   exists(
                                select  0
                                from    dbo.po_transaction pot
                                where   pot.po_policy_master_fk = pm.po_policy_master_pk
                                and     pot.pr_tran_type_code = ''NEWBUSINESS''
                                and     pot.transaction_cycle_code not in (''BOUND'',''VOIDED'',''ISSUED'',''BINDEREXPIRED''))'

                    END
                ELSE IF ISNULL(@Status,'') = 'Bound'
                    BEGIN
                        SET @USAquery = @USAquery + 
                        ' AND   exists(
                                select  0
                                from    dbo.po_transaction pot
                                where   pot.po_policy_master_fk = pm.po_policy_master_pk
                                and     pot.pr_tran_type_code = ''NEWBUSINESS''
                                and     pot.transaction_cycle_code in (''BOUND'',''BINDEREXPIRED''))'

                        SET @NonUSAquery = @NonUSAquery + 
                        ' AND   exists(
                                select  0
                                from    dbo.po_transaction pot
                                where   pot.po_policy_master_fk = pm.po_policy_master_pk
                                and     pot.pr_tran_type_code = ''NEWBUSINESS''
                                and     pot.transaction_cycle_code in (''BOUND'',''BINDEREXPIRED''))'
                    END                     
                ELSE
                    BEGIN
                        SET @USAquery = @USAquery + '  AND PM.policy_status_code='
                        SET @USAquery = @USAquery + ''''+ @Status + ''''+''
                        SET @NonUSAquery = @NonUSAquery + '  AND PM.policy_status_code='
                        SET @NonUSAquery = @NonUSAquery + ''''+ @Status + ''''+''
                    END
            END
    END
IF ISNULL(@Accountpk,'') <> ''
    BEGIN
    IF ISNULL(@Accountpk,'') <> 'ALL'
        BEGIN
            SET @USAquery = @USAquery + ' AND PM.Po_Agent_Account_Fk in ('
            SET @USAquery = @USAquery + ''''+ @Agentpk + ''''+')'
            SET @NonUSAquery = @NonUSAquery + ' AND PM.Po_Agent_Account_Fk in ('
            SET @NonUSAquery = @NonUSAquery + ''''+ @Agentpk + ''''+')'
        END
    END
IF ISNULL(@Issuecopk,'') <> ''
    BEGIN
        IF ISNULL(@Issuecopk,'') <> 'ALL'
            BEGIN
                SET @USAquery = @USAquery + ' AND PM.ISSUECO_CLIENT_FK='
                SET @USAquery = @USAquery + ''''+ @Issuecopk + ''''+''
                SET @NonUSAquery = @NonUSAquery + ' AND PM.ISSUECO_CLIENT_FK='
                SET @NonUSAquery = @NonUSAquery + ''''+ @Issuecopk + ''''+''
            END
    END
IF ISNULL(@Productpk,'') <> ''
    BEGIN
        IF ISNULL(@Productpk,'') <> 'ALL'
            BEGIN
                SET @USAquery = @USAquery + ' AND PM.pr_product_fk='
                SET @USAquery = @USAquery + ''''+ @Productpk + ''''+''
                SET @NonUSAquery = @NonUSAquery + ' AND PM.pr_product_fk='
                SET @NonUSAquery = @NonUSAquery + ''''+ @Productpk + ''''+''
            END
    END
IF ISNULL(@UserType,'') = 'AGENT'
    BEGIN
        SET @USAquery = @USAquery + '                       
            AND PM.PO_AGENT_ACCOUNT_FK IN(SELECT PA_ACCOUNT_MASTER_PK FROM PA_ACCOUNT_MASTER 
            WHERE   OWNER_CLIENT_FK IN (SELECT AGENT_CLIENT_FK FROM AS_USER_AGENT 
            WHERE AS_USER_FK = '+''''+convert(varchar,@As_User_PK) + ''''+''+ ' ))'

        SET @NonUSAquery = @NonUSAquery + '
            AND PM.PO_AGENT_ACCOUNT_FK IN(SELECT PA_ACCOUNT_MASTER_PK FROM PA_ACCOUNT_MASTER 
            WHERE   OWNER_CLIENT_FK IN (SELECT AGENT_CLIENT_FK FROM AS_USER_AGENT 
            WHERE AS_USER_FK = '+''''+convert(varchar,@As_User_PK) + ''''+''+ ' ))'

    END
-- Create table #tblcount (Nofofrows numeric(18,0))

-- SET @Selectionquery = 'Insert into #tblcount select count(PM.PO_POLICY_MASTER_PK) ' + @USAquery + ' UNION ALL ' + 'select count(PM.PO_POLICY_MASTER_PK) ' + @NonUSAquery

-- Exec(@Selectionquery) -- Set @errordesc = ''

-- select @errordesc = Error_Description from screen_error_message where Error_No=5339

-- If (select sum(Nofofrows) from #tblcount) > @TopRows -- Begin -- --Set @Selectionquery = 'Select ''NOTE'', '''', ''Too Many Rows Returned'', '''', '''', '''', '''', '''', '''', ''0''' -- Set @Selectionquery = 'Select ''NOTE'', ''>' + convert(varchar(3), @TopRows) + ' rows'', ''' + @errordesc +''', '''', '''', '''', '''', '''', '''', ''0''' -- Exec(@Selectionquery) -- End -- else -- Begin

        Create table #tblpolicydata (
                POLICY_NO varchar(25),
                POLICY_STATUS_CODE varchar(25),
                LAST_ORG_NAME varchar(250), 
                FULL_LEGAL_NAME varchar(250),
                 ADDRESS_LINE1 varchar(250),
                TOWN_CITY varchar(250),
                TERM_DATES varchar(25),
                 AGENTLAST_ORG_NAME varchar(250),
                ISSUECO varchar(250),
                PRODUCT varchar(50),
                PO_POLICY_MASTER_PK numeric(18,0))
        --MODIFIED BY SARATH FOR COMPATABILITY MODE ON JAN 15 2014
/* SET @Selectionquery = 'Insert into #tblpolicydata ' + @USQueryColumns + ' ' + @USAquery +
' UNION ALL ' + @NONUSQueryColumns + ' ' + @NonUSAquery + ' ORDER BY CL.LAST_ORG_NAME' */ SET @Selectionquery = 'Insert into #tblpolicydata ' + @USQueryColumns + ' ' + @USAquery +
' UNION ALL ' + @NONUSQueryColumns + ' ' + @NonUSAquery + ''

        Exec(@Selectionquery)

        update  #tblpolicydata 
        Set     POLICY_STATUS_CODE = (Select pot.transaction_cycle_code 
                                    From    dbo.po_transaction pot
                                    where   pot.po_policy_master_fk = #tblpolicydata.PO_POLICY_MASTER_PK
                                    and     pot.pr_tran_type_code = 'NEWBUSINESS')
        where   POLICY_STATUS_CODE = 'Prospect'


        Select  POLICY_NO,
                upper(POLICY_STATUS_CODE) POLICY_STATUS_CODE,
                LAST_ORG_NAME,
                FULL_LEGAL_NAME,
                ADDRESS_LINE1,
                TOWN_CITY,
                TERM_DATES,
                AGENTLAST_ORG_NAME,
                ISSUECO,
                PRODUCT,
                PO_POLICY_MASTER_PK
        From    #tblpolicydata 
        GROUP BY POLICY_NO,
                upper(POLICY_STATUS_CODE),
                LAST_ORG_NAME,
                FULL_LEGAL_NAME,
                ADDRESS_LINE1,
                TOWN_CITY,
                TERM_DATES,
                AGENTLAST_ORG_NAME,
                ISSUECO,
                PRODUCT,
                PO_POLICY_MASTER_PK
        order   by POLICY_NO

        Drop table #tblpolicydata
-- End -- Drop table #tblcount --Exec INSCS_ClientSearch '','','','','','','India','','','','','','' Set NOCOUNT OFF End
在获取主查询中所需的字段时,确实不需要临时处理。只需在主查询中将该值重新分配给策略\状态\代码

同样,不需要获取MAXpo_term_master_pk的子查询,您已经有了详细的数据,并且已经在对返回的结果进行分组,为什么子查询在内部联接中

您的状态检查将大大降低查询速度。您已经点击了主查询中的所有字段,然后按照除状态标志之外的所有字段进行分组。只需使用计算字段并在外部查询中求和即可

下面发布的代码不会编译,也不会提供正确的数据,但是,您可能希望使用它来开始改进上面发布的代码的性能

WHERE
  (@FilterField1 IS NULL OR(MyTable.Field1 = @FilterField1))

看看执行计划,看看它在做什么,而不仅仅是在这里发布大量的SQL,并希望其他人也这样做you@CSK将存储过程分解为更小的语句块,并在实际执行计划打开的情况下运行查询。尝试在最常用的列上添加适当的索引,并检查是否正在进行任何表扫描。在这里执行需要更多的时间。我想减少执行时间。请提供一些想法以减少时间您甚至没有发布代码,我们如何为您提供帮助?堆栈溢出用户不是透视者。
SELECT
    *
FROM
(
    SELECT 
        *,
        BoundFlag  = CASE WHEN MAX(BoundFlag) = 1 THEN 1 ELSE 0 END,
        VoidedFlag = CASE WHEN MAX(VoidedFlag) = 1 THEN 1 ELSE 0 END,
        IssuedFlag = CASE WHEN MAX(IssuedFlag) = 1 THEN 1 ELSE 0 END,
        BinderExpiredFlag= CASE WHEN MAX(BinderExpiredFlag) =1 THEN 1 ELSE 0 END,
        MaxPoTermMasterPK= max(po_term_master_pk)   
    FROM
    (

        SELECT  

                BoundFlag  = CASE WHEN pot.transaction_cycle_code ='BOUND' THEN 1 ELSE 0 END,
                VoidedFlag = CASE WHEN pot.transaction_cycle_code ='VOIDED' THEN 1 ELSE 0 END,
                IssuedFlag = CASE WHEN pot.transaction_cycle_code ='ISSUED' THEN 1 ELSE 0 END,
                BinderExpiredFlag= CASE WHEN pot.transaction_cycle_code ='BINDEREXPIRED' THEN 1 ELSE 0 END,
                HasProspectFlag = CASE WHEN POLICY_STATUS_CODE = 'Prospect' THEN 1 ELSE 0 END,
                POLICY_STATUS_CODE = CASE WHEN POLICY_STATUS_CODE = 'NEWBUSINESS'  THEN  'PROSPECT' ELSE POLICY_STATUS_CODE,
                PM.POLICY_NO,
                --MODIFIED BY SARATH FOR COMPATABILITY MODE ON JAN 15 2014
                --ltrim(rtrim(ltrim(rtrim(isnull(CL.first_name,'+''''+' '+''''+') + '+''''+' '+''''+'+ isnull(CL.middle_name,'+''''+''+''''+'))) + '+''''+' '+''''+ '+ CL.last_org_name)) as  last_org_name , 
                Replace(ltrim(rtrim(ltrim(rtrim(isnull(CL.first_name,'+''''+' '+''''+') + '+''''+' '+''''+'+ isnull(CL.middle_name,'+''''+''+''''+'))) + '+''''+' '+''''+ '+ CL.last_org_name)), ''&'', ''-'') as  LASTORGNAME , 
                Replace(CL.FULL_LEGAL_NAME, ''&'', ''-'') as FULL_LEGAL_NAME, 
                CA.ADDRESS_LINE1, 
                CA.TOWN_CITY + '+''''+' '+''''+' +  ISNULL(CLSTATE.STATE_NAME,CA.STATE_CODE), 
                CONVERT(VARCHAR(20), TERM.Term_Start_Date,101)+ '+''''+' - '+''''+' +CONVERT(VARCHAR(20),TERM.Term_End_Date,101),
                Replace(CLAGENT.LAST_ORG_NAME, ''&'', ''-'') as LAST_ORG_NAME, 
                (Select SCREEN_NAME from CL_CLIENT where CL_CLIENT_PK=PM.ISSUECO_CLIENT_FK), 
                PRODUCT.Screen_Name, 
                PM.PO_POLICY_MASTER_PK
                FROM
                dbo.PO_POLICY_MASTER PM 
                INNER JOIN  dbo.PO_POLICY_MASTER PM ON PM.<PrimaryKey>=FlagDetail.<PrimaryKey>
                INNER JOIN CL_CLIENT CL ON      PM.OWNER_CLIENT_FK = CL.CL_CLIENT_PK
                LEFT OUTER  JOIN CL_Client_Name ON CL.CL_CLIENT_PK = CL_CLIENT_NAME.CL_CLIENT_FK
                LEFT OUTER JOIN CL_ADDRESS CA ON CL.CL_CLIENT_PK = CA.CL_CLIENT_FK IS_USA='Y' --YOU DNOT NEED IS NULL ISNULL(IS_USA,'+''''+'N'+''''+') = '+''''+'Y'+'''
                LEFT OUTER JOIN CL_Role_Client crc_us ON cl.CL_Client_PK = crc.Role_Client_FK AND crc.Source_FK = pm.PO_Policy_Master_PK AND  crc.Role_Type_Code = 'POLICY' AND crc.Role_Address_FK = ca.CL_Address_PK
                --YOU DONT NEED TO JOIN AGAIN FOR NON US - YOU ARE USING THE SAME CONDITION LEFT OUTER JOIN CL_Role_Client crc_us ON cl.CL_Client_PK = crc.Role_Client_FK AND crc.Source_FK = pm.PO_Policy_Master_PK AND  crc.Role_Type_Code = 'POLICY' AND crc.Role_Address_FK = ca.CL_Address_PK
                INNER JOIN PO_RISK_MASTER RISK ON RISK.PO_POLICY_MASTER_FK = PM.PO_POLICY_MASTER_PK
                LEFT OUTER JOIN CL_COUNTRY_STATE CLSTATE ON CA.Country_Code = CLSTATE.CL_Country_Code AND CLSTATE.STATE_CODE = CA.STATE_CODE
                /* SEE COMMENTS - TRY TO AVOID A SUBQUERY IN YOUR JOINS ! 
                INNER JOIN PO_TERM_MASTER TERM ON TERM.PO_POLICY_MASTER_FK = PM.PO_POLICY_MASTER_PK 
                        --You could replace this subquery below with a master subquery reducing burden on the join
                        AND     TERM.PO_TERM_MASTER_PK = 
                        (
                            SELECT    max(po_term_master_pk) 
                            FROM    PO_TERM_MASTER 
                            WHERE   PO_TERM_MASTER.PO_POLICY_MASTER_FK = PM.po_policy_master_PK
                        ) 
                */
                LEFT OUTER JOIN PA_ACCOUNT_MASTER ACCT ON ACCT.pa_account_master_pk = PM.PO_AGENT_ACCOUNT_FK 
                LEFT OUTER JOIN CL_CLIENT CLAGENT ON CLAGENT.cl_client_pk = ACCT.owner_client_fk 
                INNER JOIN PR_PRODUCT PRODUCT ON PRODUCT.PR_PRODUCT_PK = PM.PR_PRODUCT_FK 
                LEFT OUTER JOIN  dbo.po_transaction pot ON pot.po_policy_master_fk = pm.po_policy_master_pk and pot.pr_tran_type_code = 'NEWBUSINESS'
            WHERE   
                (@LastName IS NULL OR (CL_CLIENT_NAME.LAST_ORG_NAME_UCASE LIKE  @Lastname + '%')) --Check your collation - I bet you dont need UCASE
                AND
                (@FisrtName IS NULL OR (CL_CLIENT_NAME.FIRST_ORG_NAME_UCASE LIKE  @Fisrtname + '%'))--Check your collation - I bet you dont need UCASE
                AND
                (@City IS NULL OR (CA.TOWN_CITY LIKE  @City + '%') -- You probally dont need UPPERCASE HERE Check your collation
                AND
                (@Address1 IS NULL OR(CA.ADDRESS_LINE1 LIKE '%' +@Address1 + '%'))
                AND
                (@HullID IS NULL OR(RISK.RISK_EXTERNAL_ID LIKE '%' + @HullID + '%'))
                AND
                (@StateID IS NULL OR(CLSTATE.STATE_NAME LIKE @State + '%'))
                AND
                (1=1 and PRODUCT.PR_Product_Code <> 'BBRENTAL') --WHats with the 1=1?
                AND
                (@UserType<>'AGENT' OR(PM.PO_AGENT_ACCOUNT_FK IN(SELECT PA_ACCOUNT_MASTER_PK FROM PA_ACCOUNT_MASTER WHERE   OWNER_CLIENT_FK IN (SELECT AGENT_CLIENT_FK FROM AS_USER_AGENT WHERE AS_USER_FK = convert(varchar,@As_User_PK) )))
                AND
                ((@Accountpk IS NULL OR @Accountpk='ALL') OR(PM.Po_Agent_Account_Fk =@Agentpk))
                AND
                ((@Issuecopk IS NULL OR @Issuecopk='ALL') OR(PM.ISSUECO_CLIENT_FK =@Issuecopk))
                AND
                ((@Productpk IS NULL OR @Productpk='ALL') OR(PM.pr_product_fk =@Issuecopk))

    )AS DETAIL
    GROUP BY
        PM.POLICY_NO,
        PM.POLICY_STATUS_CODE,
        LASTORGNAME , 
        FULL_LEGAL_NAME, 
        CA.ADDRESS_LINE1, 
        CA.TOWN_CITY,
        CLSTATE.STATE_NAME,
        CA.STATE_CODE, 
        TERM.Term_Start_Date,
        TERM.Term_End_Date
        CLAGENT.LAST_ORG_NAME,
        LAST_ORG_NAME, 
        PM.ISSUECO_CLIENT_FK, 
        PRODUCT.Screen_Name, 
        PM.PO_POLICY_MASTER_PK,
        pr_tran_type_code 
)AS SUMMARY
WHERE
    (PO_TERM_MASTER_PK = MaxPoTermMasterPK)
    AND
    (
        (@Status IS NULL )
        OR
        (
            (@Status ='Quote' AND  (IsBound + IsVoided + IsIssued + IsBinderExipired = 0))
            OR
            (@Status ='Bound' AND ( IsBound + IsBinderExipired > 0))
        )
    )
ORDER BY
    POLICY_NO