• sql 存储过程 执行中 遇到的 问题 小结


    防注入  检验关键字

    CREATE FUNCTION [dbo].[FilterWhere]
    (
     @isOnlyWhere bit,  --0表示含 select 主语句, 1表示仅where条件的过滤
     @strWhere nvarchar(4000)--where 条件
    )
    RETURNS nvarchar(4000)  
    AS
    BEGIN
     -- Declare the return variable here
     --'and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join'--原版
     declare @keywords nvarchar(500)
     set @keywords='exec|insert|delete|update|master|truncate|declare|sp_executesql|drop|table'
     if(@isOnlyWhere<>0)set @keywords=@keywords+'|select|from|join'
     declare @myid int,@tempcount int
     declare @tempkeyword nvarchar(30)
     select @tempcount=count(*)from Fun_Split_SqlKeyWord(@keywords,'|')
     set @myid=1
     
     declare @nohas bit
     set @nohas = 1
     
     while (@myid-1<@tempcount)
     begin
      select @tempkeyword=mykeyword  from Fun_Split_SqlKeyWord(@keywords,'|') where myid=@myid
      --是否有关键字
      if charindex(@tempkeyword,@strWhere) > 0
       set @nohas = @nohas & 0
      else
       set @nohas = @nohas & 1
       
      set @strWhere=replace(@strWhere,@tempkeyword,'')
      set @myid=@myid+1
     end
     -- Return the result of the function
     --RETURN @strWhere
     if @nohas = 0
      return dbo.FilterWhere(@isOnlyWhere,@strWhere)
     --else
      return @strWhere

    END

     过程中出现 in  时,引号的匹配时拼接的情况  下拉打印语句  用 print @str               Execute sp_executesql @str   直接执行即可

    过程 中 一个'  必须写成''  才可显示正确

    productid in (303776)

    也可改为 

    CHARINDEX(ProductId,@ProductId)>0

    语法

     

      CHARINDEX ( expression1 , expression2 [ , start_location ] )

     

      参数

     

      expression1

     

      一个表达式,其中包含要寻找的字符的次序。expression1 是一个短字符数据类型分类的表达式。

     

      expression2

     

      一个表达式,通常是一个用于搜索指定序列的列。expression2属于字符串数据类型分类。

     

      start_location

     

      在 expression2 中搜索 expression1 时的起始字符位置。如果没有给定 start_location,而是一个负数或零,则将从 expression2的起始位置开始搜索。

     

      返回类型

     

      int

     

      注释

     

      如果 expression1expression2之一属于 Unicode 数据类型(nvarchar 或 nchar)而另一个不属于,则将另一个转换为 Unicode 数据类型。

     

      如果 expression1expression2 之一为 NULL 值,则当数据库兼容级别为 70 或更大时,CHARINDEX 返回 NULL 值。当数据库兼容级别为 65 或更小时,CHARINDEX 仅在 expression1expression2都为 NULL 时返回 NULL 值。

     

      如果在 expression2 内没有找到 expression1,则 CHARINDEX 返回 0。
     

  • 相关阅读:
    ideaj项目切换不同版本的jdk
    物理机(window)安装linux系统
    linux jar自启动
    swap扩容
    tomcat加载外部项目
    springboot2.3.2控制台输出@RequestMapping路径
    linux磁盘扩容
    springboot-easycode配置文件修改
    List
    Map HashMap跟HashTable
  • 原文地址:https://www.cnblogs.com/weixing/p/2736764.html
Copyright © 2020-2023  润新知