• SQL视图优化改写为存储过程遇到 双引号 单引号问题


    核心在于拼接SQL字符串中遇到中文双引号问题:
      可以使用系统函数 替换掉set @pageStr =   replace(@queryStr,'"','''')  不过更推荐 使用两个单引号转译 
      1 USE [TEMP]
      2 GO
      3 
      4 /****** Object:  StoredProcedure [dbo].[P_GetAlterAsset]    
      5 SET ANSI_NULLS ON
      6 GO
      7 
      8 SET QUOTED_IDENTIFIER ON
      9 GO
     10 
     11 
     12 
     13 
     14 
     15 
     16 
     17 ALTER proc [dbo].[P_GetAlterAssetPage]
     18 (  
     19  @filterCondition varchar(max)='', 
     20  @pageIndex int,
     21  @pageSize int,
     22  @totalCount int output
     23 )  
     24 AS Begin 
     25  DECLARE @queryStr NVARCHAR(MAX)=''
     26  DECLARE @pageStr NVARCHAR(MAX)=''
     27  DECLARE @endStr NVARCHAR(MAX)=''
     28  DECLARE @countStr NVARCHAR(MAX)=''
     29  DECLARE @and NVARCHAR(MAX)=''
     30  
     31 
     32  
     33  set @and = @filterCondition
     34  set @queryStr = '
     35                  WITH    T1  
     36                           AS ( SELECT   ALDE_MSNo  
     37                                FROM     T_Alter_Apply  
     38                                         LEFT JOIN T_Alter_Detail ON ALDE_ApplyID = AP_ID  
     39                                WHERE    AP_StateID = 1  
     40                                UNION  
     41                                SELECT   [GBDE_MSNo]  
     42                                FROM     [dbo].[T_Giveback_Apply]  
     43                                         LEFT JOIN [dbo].[T_GiveBack_Detail] ON [AP_ID] = [GBDE_APID]  
     44                                WHERE    AP_State = 1  
     45                              ),  
     46                         T4 
     47                           AS ( SELECT   al.AL_State ,  
     48                                         ali.ALI_ASNo ,  
     49                                         al.[AL_ID]  
     50                                FROM     [dbo].[T_Alter] al  
     51                                         inner JOIN [dbo].[T_AlterItem] ali ON al.[AL_AlterNo] = ali.[ALI_AlterNo] 
     52                                            AND al.AL_State <> 100  
     53                             
     54                              ),  
     55 
     56                         T2  
     57                           AS ( SELECT DISTINCT  
     58                                         b.AS_TypeName , 
     59                                         b.AS_MSNo , 
     60                                         b.AS_BrandName ,
     61                                         b.AS_Model ,  
     62                                         c.AD_CPU ,  
     63                                         c.AD_HardDisk ,  
     64                                         c.AD_Memory , 
     65                                         c.AD_VideoCard AS AD_SoundCard ,
     66                                         b.AS_Price ,                                        
     67                                         b.AS_State ,  
     68                                         b.AS_CostCenterName ,  
     69                                         b.AS_CostCenterNo ,
     70                                         b.AS_Category,
     71                                         b.AS_PlaceNo,
     72                                         b.AS_PlaceName,
     73                                         b.AS_ProjectNo,
     74                                         b.AS_ProjectName,
     75                                         b.AS_VestInNo,
     76                                         b.AS_VesInName,
     77                                         b.AS_IsSpecialPro,
     78                                         b.AS_ProfitCenterNo ,
     79                                         b.AS_ProfitCenterName,
     80                                         b.AS_ComNo,
     81                                         b.AS_ComName,
     82                                         CASE WHEN T1.ALDE_MSNo IS NOT NULL
     83                                              THEN "变更中"
     84                                              WHEN ISNULL(T4.AL_State, 2) = 2
     85                                              THEN "可变更"
     86                                              ELSE "变更中"
     87                                         END AS AL_StateName
     88                               FROM     dbo.T_Asset b with(nolock) 
     89                                         LEFT JOIN dbo.T_AssetDetail c with(nolock)  ON b.AS_ADID = c.AD_ID  
     90                                         LEFT JOIN T4 with(nolock)  ON b.AS_MSNo = T4.ALI_ASNo  
     91                                         LEFT JOIN T1 with(nolock)  ON b.AS_MSNo = T1.ALDE_MSNo
     92                                         LEFT JOIN dbo.V_PSA_PrjInfo p  with(nolock)  ON b.AS_ProjectNo=p.PrjCode
     93                                WHERE    b.AS_State = 1 
     94                                         and (p.PrjTypeID NOT IN ( 710, 711 ) or p.PrjTypeID is null)
     95                                         and (p.PrjStatus IN ( 6, 10 ) or p.PrjStatus is null )
     96                                         '+@and + ')'      
     97                                       
     98   
     99   set @pageStr =   replace(@queryStr,'"','''')                 
    100   set @endStr = @pageStr+' SELECT * FROM (select  row_number() over(order by AS_Price ) as rowIndex,* FROM T2 ) tt where tt.rowIndex between '+ CAST(((@pageIndex-1)*@pageSize + 1) as nvarchar(20)) +' and '+ CAST((@pageIndex*@pageSize) as nvarchar(20))
    101   
    102   
    103   DECLARE @strCountSql NVARCHAR(max)
    104   SET @strCountSql = @queryStr +' Select @RecordCount = count(*) FROM T2 ' 
    105   EXEC sp_executesql @strCountSql, N'@RecordCount int OUTPUT', @totalCount OUTPUT
    106   
    107   execute  (@endStr)   
    108  
    109 
    110 END
    111 
    112 
    113 
    114 
    115 
    116 
    117 
    118 
    119 GO
    View Code

    此文仅作用于学习记录,之前写的为一个视图,在功能中又在外面嵌套各种条件进行查询,相当于查询所有数据后再进行分页,速度很慢,特别耗费服务器cpu资源;

    把一个视图修改为两个存储过程,一个分页,一个查询所有;调用代码如下:

     1  #region 优化为存储过程 20190104 
     2                     var parameters = new List<System.Data.SqlClient.SqlParameter>();
     3                     parameters.Add(new System.Data.SqlClient.SqlParameter("@filterCondition", sql));
     4                     parameters.Add(new System.Data.SqlClient.SqlParameter("@pageIndex", pageIndex));
     5                     parameters.Add(new System.Data.SqlClient.SqlParameter("@pageSize", pageSize));
     6                     SqlParameter outParameter = new SqlParameter("@totalCount", SqlDbType.Int, 8);
     7                     outParameter.Direction = ParameterDirection.Output;
     8                     parameters.Add(outParameter);
     9                     var lstAssets = db.Database.SqlQuery<AssetAlterInfo>("exec P_EAM_GetAlterAssetPage @filterCondition, @pageIndex, @pageSize, @totalCount out", parameters.ToArray()).ToList();
    10                     count = Convert.ToInt32(outParameter.Value == DBNull.Value ? 0 : outParameter.Value);
    存储过程分页
  • 相关阅读:
    python网络编程,requests模块
    python操作excel
    python加密模块hashlib
    python操作redis
    python操作mysql
    python常用模块3(os和sys模块)
    python打开网站
    python常用模块2
    python模块简介
    mac下开发——环境心得(杂项,持续性更新)
  • 原文地址:https://www.cnblogs.com/yanghucheng/p/10231739.html
Copyright © 2020-2023  润新知