应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

SqlServer存储过程拼接sql语句,分页

12602人阅读 2019/3/11 11:19 总访问:5186035 评论:0 收藏:1 手机
分类: 数据库


在写有些存储过程的时候需要进行sql的拼接,然后在使用exec函数执行sql语句


注意字符串的拼接,看下面一段存储过程的sql语句拼接

  1. create procedure proc_page(@page int,@row int,@username varchar,@number varchar)
  2. as 
  3. begin
  4.   --定义变量
  5.   declare @sql nvarchar(512);
  6.          
  7.   set @sql='select * from (
  8.        select *,ROW_NUMBER() over(order by id) as rownumber  from  Users 
  9.        )temp where  rownumber between '+(@page-1)*@row+1 +' and '+@page*@row
  10.  exec(@sql)
  11. end;

执行会报错:

  1.  exec proc_page 1,5,'',''

这是因为在sqlserver数据库中,字符串和数字类型相加时不会自动转换,需要手动转换,

可以使用cast函数进行转换

  1. alter procedure proc_page(@page int,@row int,@username varchar,@number varchar)
  2. as 
  3. begin
  4.   --定义变量
  5.   declare @wheresql nvarchar(512),
  6.           @sql nvarchar(512);
  7.          
  8.   set @wheresql = '';
  9.   set @sql='select * from (
  10.        select *,ROW_NUMBER() over(order by id) as rownumber  from  Users 
  11.        )temp where  rownumber between '+cast(((@page-1)*@row)+1 as varchar)+' and '+cast(@page*@row as varchar);
  12.  exec(@sql) --注意这里要加括号,而不是exec @sql,后者是执行存储过程而不是sql语句
  13. end;

然后执行就能成功了


下面可以进行分页条件的拼接

  1. alter procedure proc_page(@page int,@row int,@username nvarchar(64),@number nvarchar(64))
  2. as
  3. begin
  4.   
  5.   --拼接sql变量
  6.   declare @sql nvarchar(512);
  7.   --动态条件变量
  8.   declare @wheresql nvarchar(128);
  9.   --动态参数化变量
  10.   declare @params nvarchar(64)
  11.   set @wheresql =''
  12.   if(@username is not null and @username!='')
  13.   begin
  14.     set @wheresql+=' and username= @username';
  15.   end;
  16.   if(@number is not null and @number!='')
  17.   begin
  18.     set @wheresql+=' and number= @number';
  19.   end;
  20.    set @sql='select * from (
  21.        select *,ROW_NUMBER() over(order by id) as rownumber  from  Users where 1 = 1 '+@wheresql
  22.        +')temp where  rownumber between '+cast(((@page-1)*@row)+1 as varchar)+' and '+cast(@page*@row as varchar);
  23.    
  24.    --给动态拼接的sql提供参数化
  25.    set @params = '@username nvarchar(64),@number nvarchar(64)';
  26.    exec sp_executesql  @sql,@params,
  27.    @username=@username,
  28.    @number = @number
  29. end

执行的时候可以进行两个条件的自由组合


同时作用:

  1. exec proc_page 1,5,'吕布','NS002'

作用一条:

  1. exec proc_page 1,5,'','NS002'

这里主要是要注意,在存储过程中拼接sql语句为了安全也是需要使用参数化的,

但是exec执行sql语句是无法参数化的,所以需要使用sp_executesql来动态参数化

其实很重要的代码就是:

  1. --给动态拼接的sql提供参数化
  2.    set @params = '@username nvarchar(64),@number nvarchar(64)';
  3.    exec sp_executesql  @sql,@params,
  4.    @username=@username,
  5.    @number = @number

可以动态给拼接的sql语句参数化







欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

sqlServer order by

order by 字段名order by 第几个字段(整形)order by 排序:order by 字段名:通过字段名指定的字段排序 order by 字段数...

sqlServer保障远程连接的安全性

如果是只读的话建个视图,建个普通用户只对该视图进行读。读写的话就只能自己在加一层代理服务,由代理来进行读写,各客户...

sqlServer约束

添加表后操作约束--删除约束 altertableaj_testdropconstraintCK__aj_test__userAge__5EBF139D --为表aj_test添加默认...

sqlServer常用操作

创建临时表createtable#表名() select字段1,字段2....字段ninto#表名from表[where1=1]删除临时表ifOBJECT_ID('tempdb....

Serilog日志记录到sqlServer以及其中存在的问题

1.首先来一大串的安装Install-PackageSerilog //控制台输出 Install-PackageSerilog.Sinks.Console //文件输出 Install...

sqlServer监控sql语句

首先在工具中打开sql server profiler然后登录一下这里可以进行一些常规的筛选,不然监控的sql语句很多的右下方还可以进行...

sqlServer数据库+DBHelper

原始的ASP.NET数据库查询,所需要的帮助类publicclassDBHelper {//创建全局对象 staticSqlConnectionconn=newSqlConnecti...

Core使用codefirst创建sqlServer数据库

1.先添加以下程序包Install-PackageMicrosoft.EntityFrameworkCore Install-PackageMicrosoft.EntityFrameworkCore.SqlSer...

sqlServer ROW_NUMBER 分页

很简单的一个sql语句根据行号分页即可 select * from (select *,ROW_NUMBER() over(order by id) as rownumber from[dbo]....

sqlServer跨库复制表

sql语句:select*intoResourcefromXJ.[dbo].[Resource]注意主键、外键、约束、触发器、索引都不会被复制,只是数据会被复制...

sqlServer基础查询

select top 1 from table1 //————返回表中第一条数据 select top 10 percent * from table1 //...

sqlServer存储过程

什么是存储过程: 预编译的sql语句,可以放很多sql语句,里边可以写条件,循环,可以把一些逻辑放到存储过程里边处理 比如...

sqlServer函数

函数系统自带函数(avg,sum,min,max,count),用户自定义函数 系统分类:表值函数,标量值函数,聚合函数 函数语法:函数必...

sqlServer事务

事务:把所有的操作当中一个整体,要么全部成功,要么全部失败 一旦开启了事务所有的操作都是临时的,你可以选择提交或者...

sqlServer触发器

触发器什么是触发器:触发器是个特殊的存储过程,不是由用户触发,是系统根据事件来触发。对表操作比如 添加,删除,...