核心在于拼接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. 使用xib开发界面

    使用xib开发界面 2015-02-02 10:03 编辑: suiling 分类:iOS开发 来源:jymn_chen‘s blog   纯代码写界面有时候会降低开发效率,对于一些通用简单的界面,例 ...

  2. PAT 乙级 1027

    题目 题目地址:PAT 乙级 1027 思路 本题需要注意两点: 1. 对于每行输出字符的循环和判断没有完全搞清楚,导致在4 * 的条件下会输出7个字符,n的结果是-3. 2. 没有考虑到小于等于0的 ...

  3. 【Java_多线程并发编程】基础篇—线程状态及实现多线程的两种方式

    1.Java多线程的概念 同一时间段内,位于同一处理器上多个已开启但未执行完毕的线程叫做多线程.他们通过轮寻获得CPU处理时间,从而在宏观上构成一种同时在执行的假象,实质上在任意时刻只有一个线程获得C ...

  4. kill, killall, pkill, xkill

    1. Kill Command – Kill the process by specifying its PID All the below kill conventions will send th ...

  5. linux文件权限更改命令chmod及数字权限

    chmod -change file mode bits :更改文件权限 chmod是用来改变文件或者目录权限的命令,但只有文件的属主和超级用户(root)才有这种权限. 更改文件权限的2种方式: 一 ...

  6. 学习python的第十天(内置算法:列表数据类型,元祖数据类型,字典数据类型)

    5.8自我总结 1.列表类型内置算法 1.必须掌握 1.按索引取值(正向取值+反向取值),即可存也可以取 #用于取其中一个值 name = ['yang','wen','yi'] ##正方向取wen, ...

  7. gnu printf可变参数宏

    可变参数的宏 标准C只支持可变参数的函数,意味着函数的参数可以是不固定的 例如printf()函数的原型是int printf(const char *format [,argument]...) 而 ...

  8. ios开发中关闭textview控件的虚拟键盘

    在ios开发中,textfield控件在点击的时候出现虚拟键盘,关掉虚拟键盘可以通过虚拟键盘中的done button和点击view中的任意地方来关闭虚拟键盘. 1.第一种方法是textfield控件 ...

  9. windons杀死8080进程

    1,netstat -aon|findstr "8080" //8080端口号 2,taskkill -PID 2976 -F //2976 ,8080端口号对应的进程号

  10. Linux下二进制文件安装MySQL

    MySQL 下载地址:https://dev.mysql.com/downloads/mysql/ 并按如下方式选择来下载安装包. 1. 设置配置文件/etc/my.cnmore /etc/my.cn ...