核心在于拼接SQL字符串中遇到中文双引号问题:
  可以使用系统函数 替换掉set @pageStr =   replace(@queryStr,'"','''')  不过更推荐 使用两个单引号转译 
 USE [TEMP]
GO /****** Object: StoredProcedure [dbo].[P_GetAlterAsset]
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO ALTER proc [dbo].[P_GetAlterAssetPage]
(
@filterCondition varchar(max)='',
@pageIndex int,
@pageSize int,
@totalCount int output
)
AS Begin
DECLARE @queryStr NVARCHAR(MAX)=''
DECLARE @pageStr NVARCHAR(MAX)=''
DECLARE @endStr NVARCHAR(MAX)=''
DECLARE @countStr NVARCHAR(MAX)=''
DECLARE @and NVARCHAR(MAX)='' set @and = @filterCondition
set @queryStr = '
WITH T1
AS ( SELECT ALDE_MSNo
FROM T_Alter_Apply
LEFT JOIN T_Alter_Detail ON ALDE_ApplyID = AP_ID
WHERE AP_StateID = 1
UNION
SELECT [GBDE_MSNo]
FROM [dbo].[T_Giveback_Apply]
LEFT JOIN [dbo].[T_GiveBack_Detail] ON [AP_ID] = [GBDE_APID]
WHERE AP_State = 1
),
T4
AS ( SELECT al.AL_State ,
ali.ALI_ASNo ,
al.[AL_ID]
FROM [dbo].[T_Alter] al
inner JOIN [dbo].[T_AlterItem] ali ON al.[AL_AlterNo] = ali.[ALI_AlterNo]
AND al.AL_State <> 100 ), T2
AS ( SELECT DISTINCT
b.AS_TypeName ,
b.AS_MSNo ,
b.AS_BrandName ,
b.AS_Model ,
c.AD_CPU ,
c.AD_HardDisk ,
c.AD_Memory ,
c.AD_VideoCard AS AD_SoundCard ,
b.AS_Price ,
b.AS_State ,
b.AS_CostCenterName ,
b.AS_CostCenterNo ,
b.AS_Category,
b.AS_PlaceNo,
b.AS_PlaceName,
b.AS_ProjectNo,
b.AS_ProjectName,
b.AS_VestInNo,
b.AS_VesInName,
b.AS_IsSpecialPro,
b.AS_ProfitCenterNo ,
b.AS_ProfitCenterName,
b.AS_ComNo,
b.AS_ComName,
CASE WHEN T1.ALDE_MSNo IS NOT NULL
THEN "变更中"
WHEN ISNULL(T4.AL_State, 2) = 2
THEN "可变更"
ELSE "变更中"
END AS AL_StateName
FROM dbo.T_Asset b with(nolock)
LEFT JOIN dbo.T_AssetDetail c with(nolock) ON b.AS_ADID = c.AD_ID
LEFT JOIN T4 with(nolock) ON b.AS_MSNo = T4.ALI_ASNo
LEFT JOIN T1 with(nolock) ON b.AS_MSNo = T1.ALDE_MSNo
LEFT JOIN dbo.V_PSA_PrjInfo p with(nolock) ON b.AS_ProjectNo=p.PrjCode
WHERE b.AS_State = 1
and (p.PrjTypeID NOT IN ( 710, 711 ) or p.PrjTypeID is null)
and (p.PrjStatus IN ( 6, 10 ) or p.PrjStatus is null )
'+@and + ')' set @pageStr = replace(@queryStr,'"','''')
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)) DECLARE @strCountSql NVARCHAR(max)
SET @strCountSql = @queryStr +' Select @RecordCount = count(*) FROM T2 '
EXEC sp_executesql @strCountSql, N'@RecordCount int OUTPUT', @totalCount OUTPUT execute (@endStr) END GO

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

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

  #region 优化为存储过程 20190104
var parameters = new List<System.Data.SqlClient.SqlParameter>();
parameters.Add(new System.Data.SqlClient.SqlParameter("@filterCondition", sql));
parameters.Add(new System.Data.SqlClient.SqlParameter("@pageIndex", pageIndex));
parameters.Add(new System.Data.SqlClient.SqlParameter("@pageSize", pageSize));
SqlParameter outParameter = new SqlParameter("@totalCount", SqlDbType.Int, );
outParameter.Direction = ParameterDirection.Output;
parameters.Add(outParameter);
var lstAssets = db.Database.SqlQuery<AssetAlterInfo>("exec P_EAM_GetAlterAssetPage @filterCondition, @pageIndex, @pageSize, @totalCount out", parameters.ToArray()).ToList();
count = Convert.ToInt32(outParameter.Value == DBNull.Value ? : outParameter.Value);

存储过程分页

SQL视图优化改写为存储过程遇到 双引号 单引号问题的更多相关文章

  1. 在ASP学习当中对双引号,单引号以及&符号的理解

    在我的Web安全学习的开始需要对ASP的代码有一定的熟悉程度但是在查看源码的时候经常性的看到双引号,单引号以及&号.并且对他们的用法经常产生疑惑的地方,这里是我搜集的一些理解和感悟,以期对AS ...

  2. ASP中双引号单引号和&连接符使用技巧

    ASP中双引号单引号和&连接符使用技巧 一.ASP中处在双引号中的可以是任意的字符.字符串,HTML代码 1.<%response.write ("I am here" ...

  3. sed 双引号 单引号的区别

    a="abcd" b="abc" sed -i '/$a/ s/$/$b/' test.a 我想在test.a中匹配以”abcd“开头的行,然后在行尾加入”ab ...

  4. Python字符串符号:双引号/单引号用法注解。

    众所周知python中单引号和双引号常常被我们所使用,例如print.input等等. 但是对于打印输出所引导的字符串大多都是用双引号的形式来做,"Hello,python!",而 ...

  5. shell 脚本中双引号 单引号 反引号 的区别

    转自:http://blog.csdn.net/iamlaosong/article/details/54728393 最近要编个shell脚本处理数据,需要检测数据文件是否存在,文件名中包含日期,所 ...

  6. mysql where in形式存储过程如何传递带有单引号的入参

    对于存储过程或者函数,我们通常都有这样的一个需求,传递一个参数,输出一个结果.如:我传递一个账号,返回这个账号所拥有的权限.但是如果这个需求改了,我要传递多个账号,获取这些账号权限,但是账号的个数不限 ...

  7. SQL注入之Sqli-labs系列第十一关(基于单引号的万能密码注入)

    本来以前写过sqli-labs的实战文章,但由于搞了事情,自己的服务器IP被封了,到期后又不太想续了,就一直没管.心酸的痛,都懂的....... 好了,最近这两天一口气写完前十关GET型的,现在到了P ...

  8. PHP 单引号与双引号的区别 SQL中的使用

    php单引号与双引号用法:引号嵌套方法 1.双引号内不能直接就再嵌套双引号 2.双引号与单引号互相嵌套使用 如: 双引号内直接嵌套单引号 echo "<script language= ...

  9. Unix Shell中单引号、双引号字符、反斜杠、反引号的使用[转]

    在执行shell脚本的时候,shell将会对脚本中的行进行解释,然后执行:对于一些特殊处理的句子,我们可以使用引号或者反斜线来避免shell解释执行之.如下,当在命令行中输入:echo *child. ...

随机推荐

  1. windows下使用gcc完成头文件和目标文件编译

    环境要求 安装了gcc win+r然后输入cmd , dos界面输入 gcc -v 查看有没有安装gcc 进入正题 新建 text.c文件键入如下代码: #include <stdio.h> ...

  2. asyn_fifo

    //Module Name:afifo_ctrl //Description:parameterized afifo module afifo_ctrl( clk_push, rst_push_n, ...

  3. PAT Basic 1060

    1060 爱丁顿数 英国天文学家爱丁顿很喜欢骑车.据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数” E ,即满足有 E 天骑车超过 E 英里的最大整数 E.据说爱丁顿自己的 E 等于87. 现给 ...

  4. JSP标签:jsp内置标签、jstl标签、自定义标签

     一.jsp标签的分类: 1)内置标签(动作标签): 不需要在jsp页面导入标签 2)jstl标签: 需要在jsp页面中导入标签 3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签    1 ...

  5. NYIS OJ 42 一笔画问题

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...

  6. Leetcode 406.根据身高重建队列

    根据身高重建队列 假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列. 注意:总人 ...

  7. Azure Storage Blob文件重命名

    Azure Storage的SDK并没有提供文件重命名的方法,而且从StorageExplorer管理工具里操作修改文件名的时候也有明确提示: 是通过复制当前文件并命名为新文件名再删除旧文件,不保存快 ...

  8. EasyUI 动态生成列加分页

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...

  9. [UOJ#221][BZOJ4652][Noi2016]循环之美

    [UOJ#221][BZOJ4652][Noi2016]循环之美 试题描述 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 k 进制下,一个数的小数部 ...

  10. 如果您无法使用Docker的存储库来安装Docker CE

    如果您无法使用Docker的存储库来安装Docker CE,则可以下载.deb适用于您的发行版的 文件并手动安装.每次要升级Docker CE时都需要下载新文件. 转到https://download ...