SQL实现递归及存储过程中In()参数传递解决方案[转]

SQL实现递归及存储过程中In()参数传递解决方案

1.SQL递归

在SQL Server中,我们可以利用表表达式来实现递归算法,一般用于阻止机构的加载及相关性处理。

-->实现:

假设OrganiseUnit(组织机构表)中主要的三个字段为OrganiseUnitID(组织机构主键ID)、ParentOrganiseUnitID(组织机构父ID)、OrganiseName(组织机构名称)

?


1

2

3

4

5

6

7

[sql]

with organise as

(select * from OrganiseUnit where OrganiseUnit.OrganiseUnitID = @OrganiseUnitID  

union all select OrganiseUnit.* from organise, OrganiseUnit  

where organise.OrganiseUnitID = OrganiseUnit.ParentOrganiseUnitID) 

  

select OrganiseName from organise

上述sql语句实现了,传入组织机构主键ID,查询出其对应组织机构名称和其全部下级组织机构名称。

2.存储过程中 In 参数传递

-->情景

① 通过刚才的SQL递归方式,我们已经可以将一个组织机构和其全部下级单位查询出来;假设每个组织机构还有一个字段为OrganiseCode(组织机构代码);

② 当我们需要按照组织机构代码进行筛选数据时,我们会用到 In 这个查询条件,例如select * from OrganiseUnit where OrganiseCode in (‘10000001‘,‘10000003‘,‘10000002‘)

③但是in()中条件不可能总是固定不变的,有时我们需要用参数传递进去;我们可能会想到设定一个变量参数@OrganiseCode,然后按照‘10000001‘,‘10000003‘,‘10000002‘的格式拼参数不就行了吗 ?

④in使用参数时会强制转换参数类型与条件字段一致,不支持构造字符串(如果字段本身为varchar、char型,则in相当于只有一个条件值,而不是一组)

-->实现

①可以使用exec,把整个sql当做参数来执行,例如:exec (‘select * from OrganiseUnit where OrganiseCode in (‘[email protected]+‘)‘);这样存储过程修改复杂,没有防注功能。

②我们采用另一种方案来解决,先写一个SQL函数,功能是分割字符串

?


1

2

3

4

5

6

7

8

9

10

11

12

13

[sql]

create  function  SplitIn(@c   varchar(2000),@split   varchar(2))    

returns   @t   table(col   varchar(20))    

as

begin

  while(charindex(@split,@c)<>0)    

    begin

      insert   @t(col)   values   (substring(@c,1,charindex(@split,@c)-1))    

      set   @c   =   stuff(@c,1,charindex(@split,@c),‘‘)    

    end

  insert   @t(col)   values   (@c)    

  return

end

我们为这个函数传入字符串和分隔符,他就能将字符串按指定符号分割并作为查询结果返回。

例如:执行select col from SplitIn(‘10000001,10000002,10000003‘,‘,‘)

返回:

10000001

10000002

10000003

③有了这个函数,我们就有了新的解决方案了

定义参数@OrganiseCode,为其传入字符串,这个参数由一个或多个OrganiseCode构成,中间用“,”分割;

调用方式:

?


1

select * from OrganiseUnit where OrganiseCode in (select col from SplitIn(@OrganiseCode,‘,‘))

时间: 2024-11-13 06:58:45

SQL实现递归及存储过程中In()参数传递解决方案[转]的相关文章

SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?

本文出处:http://www.cnblogs.com/wy123/p/6704619.html 问题背景 在写SQL Server存储过程中,如果存储过程中定义了临时表,有些人习惯在存储过程结束的时候一个一个显式地删除过程中定义的临时表(drop table #tName),有些人又没有这个习惯,对于不明真相的群众或者喜欢思考的人会问,存储过程中定义的临时表,最后要不要主动删除,为什么?或者说是不是存储过程结束的时候删除临时表更加规范?不止一个人问过这个问题了,说实在话,本人之前确实不清楚,只

SQL传数组到存储过程中

方法一 CREATE PROC D_t_Base_Employee @str varchar(100) as declare @sql varchar(1000) set @sql='DELETE Employee WHERE ID IN ('[email protected]+')' exec (@sql) go 方法二 CREATE PROC D_t_Base_Employee @str varchar(100) as DELETE Employee WHERE CHARINDEX(','+

SQL Server存储过程中使用事务

今天修改之前一个同事写的代码,发现方法中直接执行了两个sql语句,一个是删除用户,一个是删除该用户的权限.由于数据库数据比较多,导致有时候这个两个sql不能都执行成功,数据库出现了脏数据. 鉴于这个原因,我把两个sql放到了一个存储过程中执行,在存储过程中添加事务,使其要么都执行,要么都不执行. 代码框架如下: 1 CREATE PROCEDURE pro_TrancDemo @backvalue INT OUTPUT 2 AS 3 BEGIN 4 SET NOCOUNT ON; 5 6 BEG

SQL中in参数在存储过程中传递及使用的方法

背景: 1.使用存储过程 2.存储过程中有in 3.in括号里面的内容作为参数传递 解决方案: 1.直接拼接sql 可在存储过程中拼接字符串,然后执行此字符串,类似于js中的eval PROCEDURE [dbo].[INSelect] @P_0 NVARCHAR(600) AS DECLARE @A VARCHAR(6000) SET @A='SELECT * FROM testTb WHERE zip IN ('[email protected]_0+')' 然后用系统存储过程sp_exec

SQL Server 存储过程中处理多个查询条件的几种常见写法分析,我们该用那种写法

本文出处: http://www.cnblogs.com/wy123/p/5958047.html 最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫,不知道各种写法孰优孰劣,该选用那种写法,以及各种写法优缺点,本文以一个简单的查询存储过程为例,简单说一下各种写法的区别,以及该用那种写法专业DBA以及熟悉数据库的同学请无视. 废话不多,上代码说明,先造一个测试表待用,简单说明一下这个表的情况 类似订单表,订单表有订单ID,客户ID,订单创建时间等,查询条件是

Sql Server 存储过程中查询数据无法使用 Union(All)

原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正常的SQL语句,使用了Union(All)查询: SELECT ci.CustId --客户编号 , ci.CustNam --客户名称 , ci.ContactBy --联系人 , ci.Conacts --联系电话 , ci.Addr -- 联系地址 , ci.Notes --备注信息 , ai

Sql server中根据存储过程中的部分信息查找存储过程名称的方法【视图和Function】

1.查询的语句: select a.id,b.name,a.*,b.* from syscomments a join sysobjects b on a.id=b.id where b.xtype='P' and a.text like '%usp_cm%' b.xtype='P'指定在什么类型的范围进行搜索 '%usp_cm%'就是你能记得的存储过程中的内容. 2.查找类型: select distinct xtype from sysobjects 找到数据库中所有的对象类型 P是存储过程

SQL 检索所有存储过程中是否包含某字符

--将text替换成你要查找的内容 select name from sysobjects o, syscomments s where o.id = s.id and text like '%text%' and o.xtype = 'P' --将text替换成你要查找的内容 SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%text%

Sql server存储过程中常见游标循环用法

原文:Sql server存储过程中常见游标循环用法 用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 DECLARE @A1 VARCHAR(10), @A2 VARCHAR(10), @A3 INT DECLARE YOUCURNAME CURSOR FOR SELECT A1,A2,A3 FROM YOUTABLENAME OPEN YOUCURNAME fetch next from youcurname into @a1,@a2,@a3 while