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. -------拼接where条件---------------------------------------------------------------------
  14. if(@userid>0)
  15. begin
  16. SET @strWhere += \' and [userid] = @userid \'
  17. end
  18. --\'1753/1/1 0:00:00\'为时间传过来的默认值,表示无此筛选条件
  19. if(@stime <> \'\' and @stime>\'1753/1/1 0:00:00\')
  20. begin
  21. SET @strWhere += \' and [time] >= @stime \'
  22. end
  23. --\'1753/1/1 0:00:00\'为时间传过来的默认值,表示无此筛选条件
  24. if(@etime <> \'\' and @etime>\'1753/1/1 0:00:00\')
  25. begin
  26. SET @strWhere += \' and [time] <= @etime \'
  27. end
  28. ------拼接where条件 end---------------------------------------------------------------------
  29. --查询sql
  30. set @execsql = \' SELECT TOP 1000 [id] ,[time] FROM [tradeinfo] WHERE 1 = 1 \'
  31. + @strWhere +@orderby;
  32. --参数化处理
  33. set @param =N\'@userid int,@stime datetime,@etime datetime\';
  34. EXEC sys.sp_executesql @execsql ,@param,
  35. @userid=@userid,
  36. @stime =@stime,
  37. @etime =@etime
  38. END

 

c#调用如下:

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

 

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

版权声明:本文为qk2014原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/qk2014/p/10239798.html