精华内容
下载资源
问答
  • SQL 存储过程 where 条件 动态拼接

    千次阅读 2017-03-02 18:56:25
    CREATE PROC 存储过程名字 --声明参数 @name NVARCHAR(50) AS BEGIN IF (@fwkaddress IS NOT NULL AND LEN(@fwkaddress)>0) BEGIN DECLARE @query NVARCHAR(max)='' DECLARE @sqlwhere NVARCHAR(max)
    CREATE PROC 存储过程名字
       --声明参数
       @name NVARCHAR(50)
    AS 
    BEGIN
      
    IF (@fwkaddress IS NOT NULL AND LEN(@fwkaddress)>0)
      
      BEGIN
         DECLARE @query NVARCHAR(max)=''
    	 DECLARE @sqlwhere NVARCHAR(max)
    	
    	 SET @sqlwhere =''
    	 
    	 --where条件参数的拼接
    	 SET @fwkaddress='%'+@name+'%'
    	 SET @sqlwhere='WHERE name LIKE @name '
    	 
    SET @query=
    '
    条件查询语句
    
    '+@sqlwhere
    --使用系统自带的存储过程		    
         EXEC SP_EXECUTESQL @query
    		,N'@name'
    		,@name
          END
    END
    附上博文一篇关于:
      EXEC SP_EXECUTESQL的说明  http://www.cnblogs.com/0banana0/archive/2012/03/19/2406120.html


    展开全文
  • 请教各位大侠下面的存储过程如何改? ALTER PROCEDURE [KPI].[SP_OP001] @IndicatorParameterID INT, --输入参数ID @Period int, --输入周期 @Condition NVARCHAR(MAX) --输入条件(需要传入动态...
  • Oracle存储过程拼接in语句 & 自定义split函数 简单描述一下场景,在Oracle的一个存储过程中遍历一个Cursor,然后在循环中需要用到in查询语句,而in里面的条件正是游标当前行的一个的字段值类型为字符串,形如...

    Oracle存储过程拼接in语句 & 自定义split函数

    简单描述一下场景,在Oracle的一个存储过程中遍历一个Cursor,然后在循环中需要用到in查询语句,而in里面的条件正是游标当前行的一个的字段值类型为字符串,形如:
    
    而存储过程中又自然而然的写了这样的语句(重点第四行):
    
    ```
    select count(*) into current_hjnum from t_studentinfo 
    where kslbdm_ = 1 
    and hjstreet_ = everyrow.streetcode_ 
    and hjdoornum_ in (everyrow.num_) 
    and areacode_ = everyrow.householdareaid_ 
    and bmflag_>=5;
    ```
    然而并查询不出结果,将上面的游标属性替换成具体值再查询的话就可以查出来,究竟是什么原因呢?下面具体研究一下。
    
    
    # 字符串与结果集
    
    首先打个断点调试一下(注意PLSQL调试断点是点step out,而且断点不能打在注释行):
    
    鼠标放在everyrow.num_上查看发现并没有问题,那是什么原因导致查询不到数据呢?仔细想一下突然恍然大悟,in关键字后面如果是动态的条件通常需要一个类型匹配的结果集,而我这里从游标当前行取出的值是字符串,也就是说sql其实是这样的:
    
    ```
    ... and hjdoornum_ in ('2,3,4,6,8') and ...
    ```
    而并非是预想的:
    
    ```
    ... and hjdoornum_ in (2,3,4,6,8) and ...
    ```
    所以这个代码写的有点想当然了,需要把in中的条件返回一个字符串拆分后的结果集才行,然而Oracle中并没有直接的split函数(这一点postgresql做的很强大),所以我们必须想办法自定义一个过程或者函数来实现split(字符串分割),其实也很简单,下面看一下具体实现。
    
    # 创建SPLIT函数
    
    首先需要创建一个Oracle类型(Type):
    
    ```
    CREATE OR REPLACE TYPE strsplit_type IS TABLE OF VARCHAR2 (4000)
    ```
    
    接下来就是实现SPLIT函数:
    
    ```
    create or replace function strsplit(p_value varchar2,
                                        p_split varchar2 := ',')
    return strsplit_type
    pipelined is
      v_idx       integer;
      v_str       varchar2(500);
      v_strs_last varchar2(4000) := p_value;
    
    begin
      loop
        v_idx := instr(v_strs_last, p_split);
        exit when v_idx = 0;
        v_str       := substr(v_strs_last, 1, v_idx - 1);
        v_strs_last := substr(v_strs_last, v_idx + 1);
        pipe row(v_str);
      end loop;
      pipe row(v_strs_last);
      return;
    
    end strsplit;
    ```
    
    可以看到已经正确的将字符串分割并返回了结果集,最后把存储过程中的语句修改一下即可:
    ```
    select count(*) into current_hjnum from t_studentinfo 
    where kslbdm_ = 1 
    and hjstreet_ = everyrow.streetcode_ 
    and hjdoornum_ in (select * from table(strsplit(everyrow.num_))) 
    and areacode_ = everyrow.householdareaid_ 
    and bmflag_>=5;
    ```
    
    # 总结
    
    简单记录一下这个小坑,希望对遇到类似问题的朋友有所帮助,The End。
    展开全文
  • 提示:使用FromSql执行存储过程时,如果使用'Where'、'OrderBy'等Linq语法,这些操作不会生成SQL语句,而是在.Net中对存储过程返回的集合进行过滤与排序。 4|0ExecuteSqlCommand 在DbContext暴露了一个Database属性...

    无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求。在这篇文章中,我们介绍几种执行SQL的方法。

    1|0表结构

    在具体内容开始之前,我们先简单说明一下要使用的表结构。

    public class Category{    public int CategoryID    {        get;        set;    }    public string CategoryName    {        get;        set;    }}

    在Category定义了两个字段:CategoryID、CategoryName。

    public class SampleDbContext: DbContext{    public virtual DbSet < Category > Categories    {        get;        set;    }    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)    {        var sqlConnectionStringBuilder = new SqlConnectionStringBuilder        {            DataSource = "10.0.1.5", InitialCatalog = "TestDataBase", UserID = "sa", Password = "******"        };        optionsBuilder.UseSqlServer(sqlConnectionStringBuilder.ConnectionString);        base.OnConfiguring(optionsBuilder);    }    protected override void OnModelCreating(ModelBuilder modelBuilder)    {        base.OnModelCreating(modelBuilder);        EntityTypeBuilder < Category > entityTypeBuilder = modelBuilder.Entity < Category > ();        entityTypeBuilder.ToTable("Category");        entityTypeBuilder.HasKey(e => e.CategoryID);        entityTypeBuilder.Property(e => e.CategoryID).UseSqlServerIdentityColumn();    }}

    我们使用SampleDbContext来访问数据库。

    2|0FromSql执行SQL语句

    Entity Framework Core为DbSet提供了一个扩展方法FromSql,用于执行SQL语句或存储过程,以下示例使用FromSql加载所有的数据。

    using(var dataContext = new SampleDbContext()){    var query = dataContext.Categories.FromSql("select * from Category");    var result = query.ToList();}

    对于带有参数的SQL语句,我们使用C# 6 语法将SQL写成如下:

    using(var dataContext = new SampleDbContext()){    var categoryID = 1;    var query = dataContext.Categories.FromSql($ "select * from Category where CategoryID={categoryID}");    var result = query.ToList();}

    注意:这里不是直接使用拼接的方式处理SQL,而是转化为参数化的SQL语句,这有助于防止SQL注入攻击。我们可以使用SQL Server Profiler帮我们验证:

    exec sp_executesql N 'select * from Category where CategoryID=@p0 ', N '@p0 int', @p0 = 1
    2f345fdf1f728bccaf82000d92a6de6d.png

    如果您不使用C# 6的语法特征,我们必须使用 @p0、@p1 ... @pn 做为SQL语句的参数:

    using(var dataContext = new SampleDbContext()){    var categoryID = 1;    var categoryName = "Product";    var query = dataContext.Categories.FromSql("select * from Category where CategoryID=@p0 and CategoryName=@p1"        categoryID, categoryName);    var result = query.ToList();    Assert.NotNull(result);}

    在上述SQL语句中中,将@p0映射到categoryID、@ p1映射到categoryName。

    FromSql扩展方法返回的是IQueryable对象,要们还可以接着使用一些Linq的方法,示例如下:

    using(var dataContext = new SampleDbContext()){    var categoryID = 1;    var query = dataContext.Categories.FromSql("select * from Category").Where(item => item.CategoryID == categoryID).OrderBy(item => item.CategoryName);    var result = query.ToList();}

    不过在这里,使用的是子查询,使用SQL Server Profiler捕获到的SQL语句如下:

    exec sp_executesql N 'SELECT [item].[CategoryID], [item].[CategoryName] FROM ( select * from Category ) AS [item] WHERE [item].[CategoryID] = @__categoryID_1 ORDER BY [item].[CategoryName]', N '@__categoryID_1 int', @__categoryID_1 = 1

    提示:使用FromSql时,需要在执行的SQL语句中返回所有列,并且列名必须与实体属性名相匹配,否则执行会出错。

    3|0FromSql执行存储过程

    存储过程与SQL语句写法基本一致,使用存储过程的示例如下:

    using(var dataContext = new SampleDbContext()){    var categoryID = 1;    var query = dataContext.Categories.FromSql($ "GetCategoryById {categoryID}");    var result = query.ToList();    Assert.NotNull(result);}

    这些参数的顺序必须与存储过程参数的顺序一致。

    提示:使用FromSql执行存储过程时,如果使用'Where'、'OrderBy'等Linq语法,这些操作不会生成SQL语句,而是在.Net中对存储过程返回的集合进行过滤与排序。

    4|0ExecuteSqlCommand

    在DbContext暴露了一个Database属性,它包括一个ExecuteSqlCommand方法。此方法返回一个整数,表示执行的SQL语句影响的行数。有效的操作是INSERT、UPDATE和DELETE,不能用于返回实体。

    using(var dataContext = new SampleDbContext()){    var categoryID = 1;    var categoryName = "Product";    var result = dataContext.Database.ExecuteSqlCommand($ "UPDATE dbo.Category SET CategoryName={categoryName} WHERE CategoryID={categoryID}");}

    5|0总结

    本节介绍了Entity Framework Core中执行SQL语句和存储过程的几种方法

    展开全文
  • 存储过程中遍历一个Cursor,然后在循环中需要用到in查询语句,而in里面的条件正是游标当前行的一个的字段值类型为字符串,形如:  而存储过程中又自然而然的写了这样的语句(重点第四行): select count(*) ...
     

    目录(?)[+]

     

    前言

    简单描述一下场景,在Oracle的一个存储过程中遍历一个Cursor,然后在循环中需要用到in查询语句,而in里面的条件正是游标当前行的一个的字段值类型为字符串,形如: 
    这里写图片描述

    而存储过程中又自然而然的写了这样的语句(重点第四行):

    select count(*) into current_hjnum from t_studentinfo 
    where kslbdm_ = 1 
    and hjstreet_ = everyrow.streetcode_ 
    and hjdoornum_ in (everyrow.num_) 
    and areacode_ = everyrow.householdareaid_ 
    and bmflag_>=5;

    然而并查询不出结果,将上面的游标属性替换成具体值再查询的话就可以查出来,究竟是什么原因呢?下面具体研究一下。

    字符串与结果集

    首先打个断点调试一下(注意PLSQL调试断点是点step out,而且断点不能打在注释行): 
    这里写图片描述

    鼠标放在everyrow.num_上查看发现并没有问题,那是什么原因导致查询不到数据呢?仔细想一下突然恍然大悟,in关键字后面如果是动态的条件通常需要一个类型匹配的结果集,而我这里从游标当前行取出的值是字符串,也就是说sql其实是这样的:

    ... and hjdoornum_ in ('2,3,4,6,8') and ...

    而并非是预想的:

    ... and hjdoornum_ in (2,3,4,6,8) and ...

    所以这个代码写的有点想当然了,需要把in中的条件返回一个字符串拆分后的结果集才行,然而Oracle中并没有直接的split函数(这一点postgresql做的很强大),所以我们必须想办法自定义一个过程或者函数来实现split(字符串分割),其实也很简单,下面看一下具体实现。

    创建SPLIT函数

    首先需要创建一个Oracle类型(Type):

    CREATE OR REPLACE TYPE strsplit_type IS TABLE OF VARCHAR2 (4000);

    接下来就是实现SPLIT函数:

    CREATE OR REPLACE FUNCTION str_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)

      RETURN strsplit_type

    IS

      j INT := 0;

      i INT := 1;

      len INT := 0;

      len1 INT := 0;

      str VARCHAR2 (4000);

      str_split1 strsplit_type := strsplit_type ();

    BEGIN

      len := LENGTH (p_str);

      len1 := LENGTH (p_delimiter);

     

      WHILE j < len

      LOOP

        j := INSTR (p_str, p_delimiter, i);

     

        IF j = 0

        THEN

            j := len;

            str := SUBSTR (p_str, i);

            str_split1.EXTEND;

            str_split1 (str_split1.COUNT) := str;

     

            IF i >= len

            THEN

              EXIT;

            END IF;

        ELSE

            str := SUBSTR (p_str, i, j - i);

            i := j + len1;

            str_split1.EXTEND;

            str_split1 (str_split1.COUNT) := str;

        END IF;

      END LOOP;

     

      RETURN str_split1;

    END str_split;

     

     

    最后验证一下: 

    这里写图片描述

    可以看到已经正确的将字符串分割并返回了结果集,最后把存储过程中的语句修改一下即可

    selectcount(*) into current_hjnum from t_studentinfo where kslbdm_ = 1and hjstreet_ = everyrow.streetcode_ and hjdoornum_ in (select * fromtable(strsplit(everyrow.num_))) and areacode_ = everyrow.householdareaid_ and bmflag_>=5;

    总结

    简单记录一下这个小坑,希望对遇到类似问题的朋友有所帮助,The End。

    展开全文
  • 先说说场景吧, 为什么...但分页能不能用存储过程来做呢? 其实也是可以的, 有两种方式: 1. 类似:ISNULL(@fbillno,'')='' OR t1.fbillno = @fbillno这种方法非常简单, 不需要用到动态SQL, 但效率不高——用不到索引
  • Postgresql 存储过程--sql语句的where条件的拼接操作
  • 最近遇到需要在存储过程里面动态拼接sql。 其实挺简单,先定义sql_str变量,然后给其赋一个sql字符串的值: sql_str := 'select count(*) from amc_fwsp_sap_voucher_v t   where t.usnam = '''||userno||
  • BEGINdeclare table_name VARCHAR (100);declare stopFlag int;declare sql1 VARCHAR ...declare cursor_name cursorfor select TABLE_NAME from information_schema.KEY_COLUMN_USAGE where TABLE_NAME like ‘t...
  • mysql 存储过程变量拼接

    千次阅读 2012-05-17 17:18:00
    在模糊查询的时候使用变量,我们又想在变量的后面拼接一个%去匹配模糊查询 那么就会用到 concat函数 示例如下:  SELECT count(id) FROM config WHERE name like concat(studentName,'%'); ...
  • 存储过程变量的拼接 有时候我们需要模糊查询,但是同时我们又要 在模糊查询的时候使用变量,我们又想在变量的后面拼接一个%去匹配模糊查询 那么就会用到 concat函数 示例如下: www.2cto.com SELECT count(id) FROM...
  • 存储过程执行拼接的sql

    千次阅读 2016-12-23 15:06:08
    delimiter // drop procedure if exists looppc; create procedure looppc() begin declare i int; declare m1 varchar(1000);...SET @m1 = "SELECT * FROM `zjxx_exampeople` WHERE 1=1 "; prepare stm
  • oracle存储过程中使用字符串拼接

    千次阅读 2020-03-27 17:59:26
    Oracle存储过程拼接字符串实例: strSql := 'select * from view_dw_ASSET_SITUATION_O where N_CORPNO='''||CORPCODE||''' and (nvl('''||startTime||''',''-1'') = ''-1'' or IMPORT_DATE >= to_date('''||...
  • 由于服务器原因,我不能直接在数据访问层写SQL,所以只好抽离出来放到存储过程里面。这里就出现了一个问题,我花费了好久才弄通!其实就是很简单的一个SQL语句:update table1 set field1=value1,field2 = value2 ...
  • 存储过程过程中,如果要实现Select查询的where子句动态查询,可以用exec ( "select .... where" +@whereStr)这样的方式。但这样的话,感觉用存储过程就没什么用了,因为存储过程最大的特点就是将代码...
  • 由于服务器原因,我不能直接在数据访问层写SQL,所以只好抽离出来放到存储过程里面。 这里就出现了一个问题,我花费了好久才弄通!  其实就是很简单的一个SQL语句:  update table1 set field1=value1,field2 =...
  • 删除一条留言信息会级联删除回复信息,这时我们需要用到事务,如下SQL 代码如下:ALTER PROCEDURE [dbo].[proc_tb_leaveword_delete] ( @...leavewordID WHERE leavewordID=@leavewordID DELETE FROM tb_reply W
  • 由于服务器原因,我不能直接在数据访问层写SQL,所以只好抽离出来放到存储过程里面。 这里就出现了一个问题,我花费了好久才弄通!  其实就是很简单的一个SQL语句:  update table1 set field1=value1,field2 ...
  • oracle存储过程中like的拼接

    千次阅读 2018-07-13 11:49:16
    vSQL_LINE := ' ORDER BY ID DESC... vSQL:= 'SELECT ID,SOFT_NAME AS SOFTNAME,EXE_FILE_NAME AS EXEFILENAME,SOFT_DETAIL AS SOFTDETAIL,ROWNUM FROM T_WORK_SOFT_BASE WHERE 1 = 1';  vSQL_L := 'SELECT COUNT(...
  • 如题,C#拼接mysql的存储过程语句,如果将语句输出,直接在mysql控制台, 可以正常执行,但是在程序中执行会报错! ``` DeleteProcedureName = "proc_del_" + tbName; string str = ""; string sql = ""; ...
  • 当在写存储过程in里面的列表用个传入参数代入的时候,就需要用到如下方式: 主要用到find_in_set函数 select * from table_name t where find_in_set(t.field1,'1,2,3,4'); 当然还可以比较笨
  • alter proc sp_PagedByConditions ( @CountryCode nvarchar(20),--国家编号 @CId int,--城市的ID @PageIndex int =1,--当前要显示的页码 @PageSize int=3, --每页要显示... declare @sqlWhere nvarchar(max)='' ,@s
  • 在用临时表进行数据分页的过程中,发现用储存过程参数传递查询语句的条件,参数条件加到sql 的where后面不能直接使用,...我就网上查找比较好的解决办法,突然发现《SQLServer 存储过程中不拼接SQL字符串实现多条件查
  • 存储过程中动态sql拼接的两种写法 单引号 IN_PROTOCOL_VERSION:= '1'; OPEN p_cur FOR SELECT * FROM ACS_CMS_TRANSACTION WHERE 1=1 AND (PROTOCOL_VERSION like '%'||IN_PROTOCOL_VERSION||'%'); 三引号 ...
  • 关于怎么在字符串单引号内拼接单引号,可以使用 ''' 三个单引号这种方法,但是拼接过程要检查比较仔细,这里介绍另外一种方法,使用 ASCII 编码,单引号 ' 的编码是39,所以拼接字符串可以这样写 [sql] ...
  • DECLARE @col VARCHAR(9) ,DECLARE @val VARCHAR(100)SET @col = 'firstname' EXEC('SELECT * FROM table WHERE firstname like ''%' +@val+'%'' ORDER BY '+@col) GO 转载于:...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 156
精华内容 62
关键字:

存储过程拼接where