1. ALTER PROCEDURE [dbo].[proc_test]
  2. (
  3. @orderby nvarchar(100) = ' order by id desc ',
  4. @userid int,
  5. @stime datetime,
  6. @etime datetime
  7. )
  8. AS
  9. BEGIN
  10. DECLARE @strWhere nvarchar(1000)=''; --where条件
  11. DECLARE @execsql nvarchar(1000); -- 主语句
  12. DECLARE @param nvarchar(1000); -- 参数
  13.  
  14. -------拼接where条件---------------------------------------------------------------------
  15. if(@userid>0)
  16. begin
  17. SET @strWhere += ' and [userid] = @userid '
  18. end
  19. --'1753/1/1 0:00:00'为时间传过来的默认值,表示无此筛选条件
  20. if(@stime <> '' and @stime>'1753/1/1 0:00:00')
  21. begin
  22. SET @strWhere += ' and [time] >= @stime '
  23. end
  24. --'1753/1/1 0:00:00'为时间传过来的默认值,表示无此筛选条件
  25. if(@etime <> '' and @etime>'1753/1/1 0:00:00')
  26. begin
  27. SET @strWhere += ' and [time] <= @etime '
  28. end
  29. ------拼接where条件 end---------------------------------------------------------------------
  30.  
  31. --查询sql
  32. set @execsql = ' SELECT TOP 1000 [id] ,[time] FROM [tradeinfo] WHERE 1 = 1 '
  33. + @strWhere +@orderby;
  34.  
  35. --参数化处理
  36. set @param =N'@userid int,@stime datetime,@etime datetime';
  37. EXEC sys.sp_executesql @execsql ,@param,
  38. @userid=@userid,
  39. @stime =@stime,
  40. @etime =@etime
  41.  
  42. END

c#调用如下:

  1. SqlParameter[] parameters =
  2. {
  3. new SqlParameter("@orderby", SqlDbType.VarChar, ),
  4. new SqlParameter("@userid", SqlDbType.Int,),
  5. new SqlParameter("@stime", SqlDbType.DateTime,),
  6. new SqlParameter("@etime", SqlDbType.DateTime,)
  7. };
  8.  
  9. parameters[].Value = " order by id desc ";
  10. parameters[].Value = ;
  11. parameters[].Value = SqlDateTime.MinValue.Value;//默认最小值:1753/1/1 0:00:00
  12. parameters[].Value = SqlDateTime.MinValue.Value;//默认最小值:1753/1/1 0:00:00
  13.  
  14. var ds = ExecuteNonQuery(CommandType.StoredProcedure, "proc_test", parameters);

上面的存储过程做了参数化处理,可以避免sql注入,相比直接拼接(SET @strWhere += ' and [userid] = ' +convert(varchar,@userid),然后用EXEC()方法执行),更高效、更安全,当然维护起来有点麻烦,还有一点排序的参数@orderby好像没法参数化,以后有更好的方法再更新此文。

存储过程中拼接sql并且参数化的更多相关文章

  1. 存储过程中拼接SQL语句

    很多时候我们需要利用参数在存储过程中重新组织SQL语句,在存储过程中拼接的SQL语句只是一个字符串,不会被直接执行,所以加一个execute执行它就可以了.具体看如下演示代码: 代码: set ANS ...

  2. 在mysql存储过程中拼接sql解决in的字段类型不匹配问题

    一个朋友问我一个问题,他写了一个存储过程,并在存储过程调用了另外一个自定义的函数.该函数返回类型如'1,34,56'的字符串,并将该字符串作为存储过程的select的id条件. begin DECLA ...

  3. 存储过程中拼接sql的示例

    create or replace package body CRF_CMS_DOCTOR_PKG is --根据医院查询医生PROCEDURE P_HOSPITALBYDOCTOR_LIST ( v ...

  4. sqlserver 存储过程中拼接sql语句 动态执行

    ALTER PROC [dbo].[Student_Friend_Get] @startRowIndexId INT, @maxNumberRows INT, @schoolId INT, @grad ...

  5. 解决存储过程中拼接的SQL字符串超长导致sql语句被截取的问题

    今天遇到了一个奇葩的问题:存储过程中的sql字符串拼接的太长,超出了分页存储过程执行sql参数的nvarchar(4000)的长度. 没办法,只能修改自己的存储过程,因为分页存储过程是不能动的. 开始 ...

  6. MSSQL存储过程实现拼接sql的注意点

    这里我昨天碰到的问题就是执行一段根据变量tableName对不同的表进行字段状态的更改.由于服务器原因,我不能直接在数据访问层写SQL,所以只好抽离出来放到存储过程里面. 这里就出现了一个问题,我花费 ...

  7. mysql 存储过程动态拼接sql并执行赋值

    )) BEGIN ## 定义变量 ,) ; ## @表示全局变量 相当于php $ ## 拼接赋值 INTO 必须要用全局变量不然语句会报错 SET @strsql = CONCAT('SELECT ...

  8. SQL Server数据库存储过程中拼接字符串注意的问题

    在SQL Server数据库中书写复杂的存储过程时,一般的做法是拼接字符串,最后使用EXEC sp_executesql '拼接的字符串' 查询出结果. 先看一段代码: -- ============ ...

  9. Oracle 在函数或存储过程中执行sql查询字符串并将结果值赋值给变量

    请看黄色部分 --区县指标 THEN TVALUE_SQL := 'SELECT TO_CHAR(' || CUR_ROW.MAIN_FIELD || ') FROM ' || CUR_ROW.END ...

随机推荐

  1. theos安装详解

    1.安装 Homebrew  安装命令官方网站  https://brew.sh 2.利用 

  2. 【Python selenium自动化环境配置】4步搞定ChromeDriver版本选择

    很多刚做自动化的小伙伴,会在ChromeDriver版本选择时犯难,看来大家都被坑过,真正掌握独门绝技,都不是难事儿. 看好了主要步骤就4部 1.确定谷歌浏览器版本 2.找到谷歌浏览器版本与Chrom ...

  3. ionic3 国际化 转义 html

    <div [innerHTML]="assembleHTML(detail)"> import { DomSanitizer } from '@angular/plat ...

  4. nginx在后端服务维护时,自动挂公告页

    本想用lua玩一把,但我发现我的要求很简单,直接用upstream的weight和backup就OK了. 于是,这样玩了一把. 作个记录. 1).down 表示当前的server暂时不参与负载2).w ...

  5. PHP二维数组按某个字段排序

    //准备 二维数组 //按一个字段排序 foreach($rank as $key=>$val){ $dos[$key] = $val['timelength']; } array_multis ...

  6. 在.NET开发中的单元测试工具之(2)——xUnit.Net

    在上一篇<在.NET开发中的单元测试工具之(1)——NUnit>中讲述了如何使用NUnit在.NET开发中进行单元测试以及NUnit的一些缺点,今天将讲述如何使用xUnit.Net来进行单 ...

  7. Valgrind与内存问题

    1 简介 "Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具.Valgrind这个名字取自北欧神话中英灵殿的入口. Valgrind的最初作者是Julian Sew ...

  8. Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第五集之补充-转载“深入理解VMware虚拟网络”】

    郑重声明,此文太好,按耐不住要保存起来好好研究研究,如果侵权,联系我. 转载自王春海的http://blog.51cto.com/wangchunhai/381225,有所更改. 同时可以参考:htt ...

  9. java日志规约及配置示例终极总结

    目录 什么是日志 常用日志框架 日志级别详解 日志的记录时机 日志使用规约 logback 配置示例 loh4j2 配置示例 什么是日志? 简单的说,日志就是记录程序的运行轨迹,方便查找关键信息,也方 ...

  10. asp.net 页面生命周期事件详细

    (1)请求页面:页请求发生在页生命周期开始之前. (2)开始:在开始阶段,将设置页属性,如Request和Response.在此阶段,页还将确定请求是回发请求还是新请求,并设置IsPostBack属性 ...