SQL存储过程,(高手进) 100zhangzhen116]

发布时间:2016-12-11 14:13:31 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"SQL存储过程,(高手进) 100zhangzhen116]",主要涉及到SQL存储过程,(高手进) 100zhangzhen116]方面的内容,对于SQL存储过程,(高手进) 100zhangzhen116]感兴趣的同学可以参考一下。

表BOMT 产品P_CODE 物料 CODE          编号  BOMNO KJ-1501-024 KJ-1501-024 KJ-1501-024 KJ-1501-024 ZA150102401 KJ-1501-024 ZA150102401 ZC150103101 ZA150102401 ZC150103101 PDA00082300 ZC150103101 PDA00082300 PBA00082300 PDA00082300 PBA00082300 POA00082300 PBA00082300 POA00082300 PMA01002000 POA00082300 ZA150102401 ZC150101300 ZA150102401 ZC150101300 POA02082200 ZC150101300 POA02082200 PMA01002000 POA02082200 PMA01002000 PMB00000100 PMA01002000 根据编号BOMNO KJ-1501-024 找到它的下接。要得到显示层次 他们关系是 CODE的上接是P_CODE,看下面给的数据就知道了。 (是物料清单那样的模式) 层次   产品             物料 1 KJ-1501-024 KJ-1501-024  2 KJ-1501-024 ZA150102401   3 ZA150102401 ZC150103101    4 ZC150103101 PDA00082300     5 PDA00082300 PBA00082300      6 PBA00082300 POA00082300       7 POA00082300 PMA01002000   3 ZA150102401 ZC150101300    4 ZC150101300 POA02082200     5 POA02082200 PMA01002000      5 PMA01002000 PMB00000100 以前别人给写过一个,但是部理想,因为层次显示不清楚。是乱的。也发问过,也有高手给过相关的资料,但是鄙人没拿才华,没理解。所以才重新发帖,希望各位帮帮忙。(大号没分,所以申请小号发帖)如果需求说的不是很明确的话,还请各位发问。谢谢!

BOM按节点排序应用实例  -------------------------------------------------------------------------- --  Author : htl258(Tony) --  Date   : 2010-04-23 02:37:28 --  Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)  --          Jul  9 2008 14:43:34  --          Copyright (c) 1988-2008 Microsoft Corporation --          Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3) --  Subject: BOM按节点排序应用实例 --------------------------------------------------------------------------   --实例1: --> 生成测试数据表:tb   IF NOT OBJECT_ID('[tb]') IS NULL     DROP TABLE [tb] GO CREATE TABLE [tb]([id] INT,[code] NVARCHAR(10),[pid] INT,[name] NVARCHAR(10)) INSERT [tb] SELECT 1,'01',0,N'服装' UNION ALL SELECT 2,'01',1,N'男装' UNION ALL SELECT 3,'01',2,N'西装' UNION ALL SELECT 4,'01',3,N'全毛' UNION ALL SELECT 5,'02',3,N'化纤' UNION ALL SELECT 6,'02',2,N'休闲装' UNION ALL SELECT 7,'02',1,N'女装' UNION ALL SELECT 8,'01',7,N'套装' UNION ALL SELECT 9,'02',7,N'职业装' UNION ALL SELECT 10,'03',7,N'休闲装' UNION ALL SELECT 11,'04',7,N'西装' UNION ALL SELECT 12,'01',11,N'全毛' UNION ALL SELECT 13,'02',11,N'化纤' UNION ALL SELECT 14,'05',7,N'休闲装' GO --SELECT * FROM [tb]   -->SQL查询如下:   ;WITH T AS (     SELECT CAST(CODE AS VARCHAR(20)) AS CODE,*,         CAST(ID AS VARBINARY(MAX)) AS px      FROM tb AS A     WHERE NOT EXISTS(SELECT * FROM tb WHERE id=A.pid)     UNION ALL      SELECT CAST(B.CODE+A.CODE AS VARCHAR(20)),A.*,          CAST(B.px+CAST(A.ID AS VARBINARY) AS VARBINARY(MAX))         FROM tb AS A         JOIN T AS B            ON A.pid=B.id ) SELECT Code,Name FROM T  ORDER BY px /* Code                 Name -------------------- ---------- 01                   服装 0101                 男装 010101               西装 01010101             全毛 01010102             化纤 010102               休闲装 0102                 女装 010201               套装 010202               职业装 010203               休闲装 010204               西装 01020401             全毛 01020402             化纤 010205               休闲装   (14 行受影响) */   --实例2: --> 生成测试数据表:tb IF NOT OBJECT_ID('[tb]') IS NULL     DROP TABLE [tb] GO CREATE TABLE [tb]([id] INT,[parentid] INT,[categoryname] NVARCHAR(10)) INSERT [tb] SELECT 1,0,'test1' UNION ALL SELECT 2,0,'test2' UNION ALL SELECT 3,1,'test1.1' UNION ALL SELECT 4,2,'test2.1' UNION ALL SELECT 5,3,'test1.1.1' UNION ALL SELECT 6,1,'test1.2' GO --SELECT * FROM [tb] -->SQL查询如下: ;WITH T AS (     SELECT *,CAST(ID AS VARBINARY(MAX)) AS px      FROM tb AS A     WHERE NOT EXISTS(SELECT * FROM tb WHERE id=A.[parentid])     UNION ALL      SELECT A.*,CAST(B.px+CAST(A.ID AS VARBINARY) AS VARBINARY(MAX))       FROM tb AS A         JOIN T AS B            ON A.[parentid]=B.id ) SELECT [id],[parentid],[categoryname] FROM T  ORDER BY px /* id          parentid    categoryname ----------- ----------- ------------ 1           0           test1 3           1           test1.1 5           3           test1.1.1 6           1           test1.2 2           0           test2 4           2           test2.1 (6 行受影响) */ 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2010/04/23/5518166.aspx

引用 1 楼 fredrickhu 的回复:SQL code BOM按节点排序应用实例  -------------------------------------------------------------------------- --  Author : htl258(Tony) --  Date   : 2010-04-23 02:37:28 --  Version:Microsoft SQL Server…… 这个资料我看了但是看不懂,能不能帮我做做修改,

with cte as (   select 1 as no,P_CODE,CODE from tb where [email protected]_CODE   union all   select b.no+1,a.P_CODE,a.CODE from tb a join cte b on a.P_CODE=b.CODE ) select * from cte

http://www.cnblogs.com/JimmyGe/archive/2011/03/12/1981998.html http://www.cnblogs.com/JimmyGe/archive/2011/03/13/1983022.html CTE(公用表表达式)递归。 看看我的这篇笔记

create table BOMT(P_CODE varchar(100),CODE varchar(100),BOMNO varchar(100)) insert BOMT select 'KJ-1501-024',    'KJ-1501-024',    'KJ-1501-024' union all select 'KJ-1501-024',    'ZA150102401',    'KJ-1501-024' union all select 'ZA150102401',    'ZC150103101',    'ZA150102401' union all select 'ZC150103101',    'PDA00082300',    'ZC150103101' union all select 'PDA00082300',    'PBA00082300',    'PDA00082300' union all select 'PBA00082300',    'POA00082300',    'PBA00082300' union all select 'POA00082300',    'PMA01002000',    'POA00082300' union all select 'ZA150102401',    'ZC150101300',    'ZA150102401' union all select 'ZC150101300',    'POA02082200',    'ZC150101300' union all select 'POA02082200',    'PMA01002000',    'POA02082200' union all select 'PMA01002000',    'PMB00000100',    'PMA01002000'  --查询指定节点及其所有子节点的函数 alter function f_cid(@CODE varchar(100)) returns @t_level table(P_CODE varchar(100),CODE varchar(100),level int,level1 int) as begin   declare @level int   declare @level1 int   set @level = 1   set @level1 = 0   insert into @t_level select P_CODE,CODE , @level,@level1 from BOMT where [email protected]   while @@ROWCOUNT > 0   begin     set @level = @level + 1     set @level1 = @level1 + 1     insert into @t_level select a.P_CODE,a.CODE ,@level,     case when (select count(*) from BOMT c where a.P_CODE=c.P_CODE and c.code>a.CODE and c.CODE<>@CODE)=0  then b.level1 else 1   end     from BOMT a , @t_Level b     where a.P_CODE = b.CODE and b.level = @level - 1  and a.CODE<>@CODE   end   return end go select REPLICATE(' ',level-1)+ltrim(level) as 层次, P_CODE as 产品,CODE as 物料 from f_cid('KJ-1501-024') order by level1,level

--又修改了一下方法,不仅适用于楼主的二层结构,N层也可以 CREATE  function f_cid(@CODE varchar(100)) returns @t_level table(P_CODE varchar(100),CODE varchar(100),level int,level1 int) as begin   declare @level int   declare @level1 int   set @level = 1   set @level1 = 0   insert into @t_level select P_CODE,CODE , @level,@level1 from BOMT where [email protected]   while @@ROWCOUNT > 0   begin     set @level = @level + 1        insert into @t_level select a.P_CODE,a.CODE ,@level,     case when (select count(*) from BOMT c where a.P_CODE=c.P_CODE and c.code>a.CODE and c.CODE<>@CODE)=0  then b.level1 else (select count(*) from BOMT c where a.P_CODE=c.P_CODE and c.code>a.CODE and c.CODE<>@CODE)+ (select max(level1) from @t_Level) end     from BOMT a , @t_Level b     where a.P_CODE = b.CODE and b.level = @level - 1  and a.CODE<>@CODE   end   return end

CREATE  function  f_cid(@CODE varchar(100)) returns @t_level table(P_CODE varchar(100),CODE varchar(100),level int,level1 int) as begin   declare @level int   declare @level1 int   set @level = 1   set @level1 = 0   insert into @t_level select P_CODE,CODE , @level,@level1 from BOMT where [email protected]   while @@ROWCOUNT > 0   begin     set @level = @level + 1        insert into @t_level select a.P_CODE,a.CODE ,@level,     case when (select count(*) from BOMT c where a.P_CODE=c.P_CODE and c.code>a.CODE and c.CODE<>@CODE)=0      then b.level1     else (select count(*) from BOMT c where a.P_CODE=c.P_CODE and c.code>a.CODE and c.CODE<>@CODE)+         (select max(level1) from @t_Level)         end     from BOMT a , @t_Level b     where a.P_CODE = b.CODE and b.level = @level - 1  and a.CODE<>@CODE   end   return end go select REPLICATE(' ',level-1)+ltrim(level) as 层次, P_CODE as 产品,CODE as 物料 from f_cid('KJ-1501-024') order by level1,level 消息 1087,级别 15,状态 2,过程 f_cid,第 17 行 必须声明表变量 "@t_Level"。

引用 7 楼 zhangzhen116 的回复:SQL code CREATE  function  f_cid(@CODE varchar(100)) returns @t_level table(P_CODE varchar(100),CODE varchar(100),level int,level1 int) as begin   declare @level int   declare @level1 int   set …… 重新测试后,在最低级别的sql2000也可以通过, 请试着把原来的自定义函数f_cid删除后再重新测试一下

引用 8 楼 cd731107 的回复:引用 7 楼 zhangzhen116 的回复: SQL code CREATE function f_cid(@CODE varchar(100)) returns @t_level table(P_CODE varchar(100),CODE varchar(100),level int,level1 int) as begin declare @level int declare…… 试过了,删除的时候说没有这个函数,我的是2005的 CREATE  function  f_cid(@CODE varchar(100)) returns @t_level table(P_CODE varchar(100),CODE varchar(100),level int,level1 int) as begin   declare @level int   declare @level1 int   set @level = 1   set @level1 = 0   insert into @t_level select P_CODE,CODE , @level,@level1 from BOMT where [email protected]   while @@ROWCOUNT > 0   begin     set @level = @level + 1        insert into @t_level select a.P_CODE,a.CODE ,@level,     case when (select count(*) from BOMT c where a.P_CODE=c.P_CODE and c.code>a.CODE and c.CODE<>@CODE)=0      then b.level1     else (select count(*) from BOMT c where a.P_CODE=c.P_CODE and c.code>a.CODE and c.CODE<>@CODE)+         (select max(level1) from @t_Level)         end     from BOMT a , @t_Level b     where a.P_CODE = b.CODE and b.level = @level - 1  and a.CODE<>@CODE   end   return end go select REPLICATE(' ',level-1)+ltrim(level) as 层次, P_CODE as 产品,CODE as 物料 from f_cid('KJ-1501-024') order by level1,level

set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROCEDURE [dbo].[P_DJP] ( @deeplevel int, @firstcode nvarchar(100), @liqty int, @gd nvarchar(100), @id varchar(50) =0 ) AS SET NOCOUNT ON SET XACT_ABORT ON BEGIN create table #tree  ( bomno nvarchar(100), code nvarchar(100),  deeplevel int,  cbdesc nvarchar(100),  qty_nee numeric(19,8),  loc varchar(32), wastage numeric(6,2), liqty numeric(19,8), sh numeric(19,8),  isLeafnode int, tree nvarchar(max) default '', id varchar(50) )  declare  @cbdesc varchar(32),  @QTY_NEED numeric(19,8),  @loc varchar(32),  @wastage numeric(6,2) insert #tree  select BOMT.BOMNO,BOMT.CODE,@deeplevel,BOMT.CBDESC,BOMT.QTY_NEED,MAINBOM.LOC,BOMT.WASTAGE,ceiling((@liqty+(@liqty*(WASTAGE/100)))*QTY_NEED),(WASTAGE/100),1, BOMT.CODE + left('00000000000000000000',20-len(BOMT.CODE)),@id  from BOMT left JOIN MAINBOM on  BOMT.CODE=MAINBOM.BOMNO where [email protected]  WHILE @@rowcount > 0  BEGIN     SET @deeplevel = @deeplevel + 1     update #tree set isLeafnode= 0 from #tree          join BOMT         on [email protected]         and BOMT.BOMNO collate database_default =#tree.code     insert #tree          select @firstcode,BOMT.CODE,@deeplevel,BOMT.CBDESC,BOMT.QTY_NEED,MAINBOM.LOC,BOMT.WASTAGE,ceiling((liqty+(liqty*(WASTAGE/100)))*QTY_NEED),sh+(WASTAGE/100),1,BOMT.CODE + left('00000000000000000000',20-len(BOMT.CODE)),(#tree.id+'.1')       from BOMT         join #tree         on [email protected]         and BOMT.BOMNO collate database_default =#tree.code         left join MAINBOM          on BOMT.CODE=MAINBOM.BOMNO END select space((deeplevel-1)*2)+cast(deeplevel as varchar),code,cbdesc,qty_nee,loc,sh,liqty,id  from #tree  RETURN @@ERROR END SET NOCOUNT OFF SET XACT_ABORT OFF exec P_DJP 1,'WI-EGD-3575',1000,1103046 这个显示的层次不是我要的,能帮我修改下嘛?就像你上面函数显示的层次一样 1        KJ-1501-024    KJ-1501-024  2       KJ-1501-024    ZA150102401   3      ZA150102401    ZC150103101    4     ZC150103101    PDA00082300     5    PDA00082300    PBA00082300      6   PBA00082300    POA00082300       7  POA00082300    PMA01002000   3      ZA150102401    ZC150101300    4     ZC150101300    POA02082200     5    POA02082200    PMA01002000      5   PMA01002000    PMB00000100

拜托帮帮忙。

上一篇:微软数据库2008MCITP全中文题库.... 20分,无满意结帖,结帖人ju345345]
下一篇:【难度】!如何在聚合时,将一列的多行的内容组合起来 40hb1122]

相关文章

相关评论