ALTER PROCEDURE [dbo].[proc_test]
(
@orderby nvarchar(100) = ' order by id desc ',
@userid int,
@stime datetime,
@etime datetime
)
AS
BEGIN
DECLARE @strWhere nvarchar(1000)=''; --where条件
DECLARE @execsql nvarchar(1000); -- 主语句
DECLARE @param nvarchar(1000); -- 参数 -------拼接where条件---------------------------------------------------------------------
if(@userid>0)
begin
SET @strWhere += ' and [userid] = @userid '
end
--'1753/1/1 0:00:00'为时间传过来的默认值,表示无此筛选条件
if(@stime <> '' and @stime>'1753/1/1 0:00:00')
begin
SET @strWhere += ' and [time] >= @stime '
end
--'1753/1/1 0:00:00'为时间传过来的默认值,表示无此筛选条件
if(@etime <> '' and @etime>'1753/1/1 0:00:00')
begin
SET @strWhere += ' and [time] <= @etime '
end
------拼接where条件 end--------------------------------------------------------------------- --查询sql
set @execsql = ' SELECT TOP 1000 [id] ,[time] FROM [tradeinfo] WHERE 1 = 1 '
+ @strWhere +@orderby; --参数化处理
set @param =N'@userid int,@stime datetime,@etime datetime';
EXEC sys.sp_executesql @execsql ,@param,
@userid=@userid,
@stime =@stime,
@etime =@etime END

c#调用如下:

SqlParameter[] parameters =
{
new SqlParameter("@orderby", SqlDbType.VarChar, ),
new SqlParameter("@userid", SqlDbType.Int,),
new SqlParameter("@stime", SqlDbType.DateTime,),
new SqlParameter("@etime", SqlDbType.DateTime,)
}; parameters[].Value = " order by id desc ";
parameters[].Value = ;
parameters[].Value = SqlDateTime.MinValue.Value;//默认最小值:1753/1/1 0:00:00
parameters[].Value = SqlDateTime.MinValue.Value;//默认最小值:1753/1/1 0:00:00 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. pycharm导入自己写的模块时,模块下方出现红色波浪线的解决方案

    文章链接:https://blog.csdn.net/weixin_38383877/article/details/81121851 这种情况其实可以不用管,是可以正常运行的: 但是,如果看着不舒服 ...

  2. web页面实现文件下载的几种方法

    今天碰到文件下载的一些问题,本着知其然也要知其所以然的精神,站在巨人的肩膀上深入学习和测试了一下,抛砖引玉,现在总结结论如下: 1)标准URL下载方式可以通过在web页面中嵌入 url超级链接,标准的 ...

  3. UI设计师给的px尺寸单位,安卓如何换算成dp?

    很多UI工程师为了适配IOS,常常拿IOS手机作用参考模型,设计出来的UI稿只有PX标注的.他们也不懂Android的dp和sp单位是怎么回事.这个时候我们Android工程师如果不注意怎么转换的话, ...

  4. 如何在python脚本下启动django程序

    直接上图

  5. 抽象业务mapper

    1.抽象业务代码 package com.xingyunliushui.dao; import java.util.List; public interface BaseQueryMapper { & ...

  6. SQL 安装MySQL

    假设学员的电脑是Windows系统,如Windows7,需要准备以下软件 Microsoft .NET Framework 4.5 Visual C++ Redistributable for Vis ...

  7. Python3中的真值测试

    1. 真值测试 所谓真值测试,是指当一种类型对象出现在if或者while条件语句中时,对象值表现为True或者False.弄清楚各种情况下的真值对我们编写程序有重要的意义. 对于一个对象a,其真值定义 ...

  8. Python与R的区别和联系

    转自:http://bbs.pinggu.org/thread-3078817-1-1.html 有人说Python和R的区别是显而易见的,因为R是针对统计的,python是给程序员设计的,其实这话对 ...

  9. json2mysql

    import json import psycopg2 import sys conn = psycopg2.connect(dbname='dev', host='127.0.0.1', port= ...

  10. elasticsearch单机部署多个节点

    cp -r elasticsearch-2.4.4 elasticsearch-2.4.4-2 mv elasticsearch-2.4.4 elasticsearch-2.4.4-1 总共cp了三个 ...