澳门金沙vip多个很常用的蕴藏进度

上面是本人计算的两种方案: 第一种方案(递归式卡塔尔(قطر‎: 轻易的表布局为:
CategoryID int(4卡塔尔, CategoryName nvarchar(50State of Qatar, ParentID int(4卡塔尔(قطر‎, Depth
int(4卡塔尔国 那样依据ParentID一级级的应用递归找他的上面目录。
还应该有可以为了有助于增加CategoryLeft,CategoryRight保存他的顶头上司目录或下属目录
其次种方案:
设置二个varchar类型的CategoryPath字段来保存目录的一体化路线,将父目录id用符号分隔绝来。比方:1,5,8,10
其二种方案: 每级分类依次增加两位数字的办法 示例:
超级分类:01,02,03,04… 二级分类:0101,0102,0103,0104…
三级分类:010101,010102,010103…
分析一下,其实第二种方案并不能够真的意义上做最佳级的归类,而第三种方案,固然相比比较简单于获得各上级及下属的分类消息。但,加多和转移分类的时候操作将很麻烦。
何况,也完全违背了数据库设计范式。
其实笔者也间接在用第三种方案的。为了寻找方便,小编一时候都在新闻表里加上CategoryID和CategoryPath
而自己前日要说的算法其实是第三种方案的修改版,日常做分类都以选拔一个表格来保存分类音信。
而自己那边,要新建五个表格,三个表格是保存分类音信表,一个保存分类关系表。
表构造如下: 表1:tomi_Category CategoryID int(4卡塔尔, ‘编号 CategoryName
nvarchar(50卡塔尔国, ‘分类名称 Depth int(4State of Qatar, ‘深度 表2:tomi_CategoryBind
CategoryID int(4卡塔尔国, BindCategoryID int(4卡塔尔(قطر‎, Depth int(4State of Qatar,
增添,编辑,删除操作有一点艰辛。。作者是平昔用存款和储蓄进度的。。不明了我们能看得懂不。。哈哈。
1、增多分类(Category_Add) 复制代码
代码如下: CREATE proc [dbo].[Category_Add] @CategoryName
nvarchar(50卡塔尔, @BindCategoryID int, @CategoryID int output as declare
@Success bit set @Success=1 –生成不另行的CategoryID declare @i bit set
@i=0 while @i=0 begin set @CategoryID=LEFT(10000000 + CONVERT(bigint,
ABS(CHECKSUM(NEWID(State of QatarState of Qatar卡塔尔卡塔尔, 8卡塔尔国 if(not exists(select CategoryID from
tomi_Category where CategoryID=@CategoryID)) set @i=1 end –得到depth
declare @depth int set @depth=0 select @depth=depth from tomi_Category
where CategoryID=@BindCategoryID set @depth=@depth+1 –插入 BEGIN TRAN
insert into tomi_Category(categoryID,CategoryName,Depth)
values(@CategoryID,@CategoryName,@Depth) if(@@ERROR0) BEGIN ROLLBACK
TRAN set @Success=0 END insert into
tomi_CategoryBind(CategoryID,BindCategoryID,Depth)
values(@CategoryID,@CategoryID,@Depth) if(@@ERROR0) BEGIN ROLLBACK TRAN
set @Success=0 END insert into
tomi_CategoryBind(CategoryID,BindCategoryID,Depth) select
@CategoryID,BindCategoryID,Depth from tomi_CategoryBind where
CategoryID=@BindCategoryID if(@@E揽胜RO悍马H20卡塔尔(قطر‎ BEGIN ROLLBACK TRAN set
@Success=0 END COMMIT TRAN print @CategoryID
每一种分类在tomi_CategoryBind有完整的目录布局。。一个分拣在tomi_CategoryBind的记录数等于他在tomi_Category的depth值。
图片: 2、编辑改良分类(Category_Edit) 复制代码 代码如下: CREATE proc
[dbo].[Category_Edit] @CategoryID int, @CategoryName nvarchar(50),
@BindCategoryID int as –更新 BEGIN TRAN update tomi_Category set
CategoryName=@CategoryName where CategoryID=@CategoryID IF @@EWranglerROEscort0
BEGIN ROLLBACK TRAN return 0 END COMMIT TRAN –检验是或不是变动了上司目录
declare @is bit set @is=0 if(exists(select CategoryID from
tomi_CategoryBind where CategoryID=@CategoryID and
BindCategoryID=@BindCategoryID and Depth=(select Depth-1 from
tomi_Category where CategoryID=@CategoryID卡塔尔卡塔尔State of Qatar set @is=1 print @is
–改善了纵深 if(@is=0卡塔尔(قطر‎ BEGIN –获得上级目录的depth declare @depth int
set @depth=0 select @depth=depth from tomi_Category where
CategoryID=@BindCategoryID set @depth=@depth+1 –print @depth
–改善子目录 declare @i int declare @sCategoryID int declare
@sBindCategoryID int declare @tCategoryIDList Table ( CategoryID int,
FlagID tinyint 卡塔尔(قطر‎ insert @tCategoryIDList select c.CategoryID,0 from
tomi_Category c left join tomi_CategoryBind b on
c.CategoryID=b.CategoryID where b.BindCategoryID=@CategoryID order by
c.Depth set @i=1 set @sBindCategoryID=@BindCategoryID declare @errs int
set @errs=0 BEGIN TRAN while(@i=1) BEGIN select @sCategoryID=0 select
Top 1 @sCategoryID=CategoryID from @tCategoryIDList where FlagID=0 set
@i=@@RowCount –print @sCategoryID if @sCategoryID0 BEGIN –删除,更新
delete from tomi_CategoryBind where CategoryID=@sCategoryID set
@errs=@errs+@@error update tomi_Category set depth=@depth where
CategoryID=@sCategoryID set @errs=@errs+@@error –插入 insert into
tomi_CategoryBind(CategoryID,BindCategoryID,Depth)
values(@sCategoryID,@sCategoryID,@Depth) set @errs=@errs+@@error insert
into tomi_CategoryBind(CategoryID,BindCategoryID,Depth) select
@sCategoryID,BindCategoryID,Depth from tomi_CategoryBind where
CategoryID=@sBindCategoryID set @errs=@errs+@@error set
@sBindCategoryID=@sCategoryID set @Depth=@Depth+1 –print @sCategoryID
–print @sBindCategoryID –print @Depth –print ‘–‘ END update
@tCategoryIDList set FlagID=1 where CategoryID=@sCategoryID END
if(@errs0) BEGIN ROLLBACK TRAN return 0 END else COMMIT TRAN END
3、删除分类(Category_Del卡塔尔 会直接删除子分类 复制代码 代码如下: create proc Category_Del
@CategoryID int as BEGIN TRAN delete from tomi_Category where
CategoryID in (select CategoryID from tomi_CategoryBind where
CategoryID=@CategoryID or BindCategoryID=@CategoryID) if(@@ERROR0) BEGIN
ROLLBACK TRAN return 0 END delete from tomi_CategoryBind where
CategoryID in (select CategoryID from tomi_CategoryBind where
CategoryID=@CategoryID or BindCategoryID=@CategoryID) if(@@ERROR0) BEGIN
ROLLBACK TRAN return 0 END COMMIT TRAN
4、分类列表,显示分类(Category_List) 复制代码 代码如下: CREATE proc Category_List
as select c.* from tomi_Category c left join tomi_CategoryBind b on
c.CategoryID=b.CategoryID where b.Depth=1 order by
b.BindCategoryID,c.Depth GO exec Category_List
能够直接让分类等第查询出来。并且展现任何以来,三次询问就能够,只需剖断depth就能够。
图片: 5、上级子分类列表 (Category_upTree) 复制代码 代码如下: Create Proc Category_UpTree
@CategoryID int as select c.* from tomi_Category c left join
tomi_CategoryBind b on c.CategoryID=b.BindCategoryID where
b.CategoryID=@CategoryID order by c.Depth GO exec Category_UpTree
639一九五三3 那样就可以获取一个分拣的完整子目录集,方便啊,只要一条sql.
图片: 6、下级子分类列表(Category_downTree) 复制代码 代码如下: Create Proc
Category_DownTree @CategoryID int as select c.* from tomi_Category c
left join tomi_CategoryBind b on c.CategoryID=b.CategoryID where
b.BindCategoryID=@CategoryID order by c.Depth GO exec Category_DownTree
21779652
那样能够获得五个分类完整下级目录。比方获得有个别分类和其分类的子分类下的装有产物用这一个就好。。方便,一条sql.
图片: 以上是原来的书文,只是随便的测量试验了若干遍。。。有不当的,还请大家提议。。
呵呵。转发请申明链接,和讯头阵,多谢。 小编:汤姆iWong 时间:二〇一〇.07.18

  1澳门金沙vip 1澳门金沙vip 2/**//**********************************************************
  2澳门金沙vip 3测验数据 sql server 2004 一个表的多少插入到八个相关联表中,一条一条的插入
  3澳门金沙vip 4—涂聚文 缔友Computer新闻手艺有限公司 软件技术员 geovindu@163.com  www.dupcit.com 
  4澳门金沙vip 5—捷为工作室  涂聚文 www.dusystem.com  
  5澳门金沙vip 6**********************************************************/
  6澳门金沙vip 7—测量检验数据
  7澳门金沙vip 8–生成测验数据表构造  
  8澳门金沙vip 9  create   table   A
  9澳门金沙vip 10(    
 10澳门金沙vip 11    a_id   int identity(100,1),
 11澳门金沙vip 12    dname varchar(30),
 12澳门金沙vip 13    dates datetime default getdate()
 13澳门金沙vip 14
 14澳门金沙vip 15  GO 
 15澳门金沙vip 16  create   table   B
 16澳门金沙vip 17(
 17澳门金沙vip 18    b_id   int   identity(10,1),
 18澳门金沙vip 19    a_id   int,
 19澳门金沙vip 20        coutry varchar(30),
 20澳门金沙vip 21        bdates datetime default getdate()
 21澳门金沙vip 22)  
 22澳门金沙vip 23GO
 23澳门金沙vip 24
 24澳门金沙vip 25
 25澳门金沙vip 26create   table   C
 26澳门金沙vip 27(
 27澳门金沙vip 28    c_id   int   identity(1,1),
 28澳门金沙vip 29    b_id   int,
 29澳门金沙vip 30        ac_id   int,
 30澳门金沙vip 31        cname varchar(30),
 31澳门金沙vip 32        cdates datetime default getdate()
 32澳门金沙vip 33)  
 33澳门金沙vip 34 go  
 34澳门金沙vip 35create table E
 35澳门金沙vip 36(
 36澳门金沙vip 37     E_id int   identity(11000,1),
 37澳门金沙vip 38     E_a varchar(30),
 38澳门金沙vip 39     E_b varchar(30),
 39澳门金沙vip 40     E_c varchar(30),
 40澳门金沙vip 41     edates datetime default getdate()
 41澳门金沙vip 42)
 42澳门金沙vip 43GO
 43澳门金沙vip 44
 44澳门金沙vip 45insert into E(E_a,E_b,E_c)
 45澳门金沙vip 46              select ‘A5′,’B5′,’C5’  
 46澳门金沙vip 47union   all   select ‘A6′,’B6′,’C6’  
 47澳门金沙vip 48union   all   select ‘A7′,’B7′,’C7’  
 48澳门金沙vip 49union   all   select ‘A8′,’B8′,’C8’ 
 49澳门金沙vip 50union   all   select ‘A9′,’B9′,’C9’  
 50澳门金沙vip 51union   all   select ‘A10′,’B10′,’C10’ 
 51澳门金沙vip 52
 52澳门金沙vip 53  –创设触发器  
 53澳门金沙vip 54
 54澳门金沙vip 55drop trigger trg_A
 55澳门金沙vip 56go
 56澳门金沙vip 57  create   trigger   trg_A  
 57澳门金沙vip 58  on   A  
 58澳门金沙vip 59  for   insert  
 59澳门金沙vip 60  as  
 60澳门金沙vip 61  begin  
 61澳门金沙vip 62          insert   into   B(a_id)   select   a_id   from   inserted  
 62澳门金沙vip 63          insert   into   C(b_id)   select   @@identity  
 63澳门金沙vip 64  end  
 64澳门金沙vip 65  go  
 65澳门金沙vip 66   
 66澳门金沙vip 67  –向A表插入数据,完毕触发  
 67澳门金沙vip 68  insert   into   A(a_id)   select   1  
 68澳门金沙vip 69   
 69澳门金沙vip 70  –查看触发器履行结果  
 70澳门金沙vip 71  select   *   from   A  
 71澳门金沙vip 72  select   *   from   B  
 72澳门金沙vip 73  select   *   from   C  
 73澳门金沙vip 74   
 74澳门金沙vip 75
 75澳门金沙vip 76澳门金沙vip 77/**//*—创建职业
 76澳门金沙vip 78geovindu@163.com 缔友计算机消息手艺有限集团
 77澳门金沙vip 79涂聚文 www.dusystem.com 
 78澳门金沙vip 80*/
 79澳门金沙vip 81
 80澳门金沙vip 82GO
 81澳门金沙vip 83
 82澳门金沙vip 84CREATE   PROCEDURE   sp_InsertMm  
 83澳门金沙vip 85  @dname   varchar(20),  
 84澳门金沙vip 86  @coutry   nvarchar(50),
 85澳门金沙vip 87  @cname varchar(50)
 86澳门金沙vip 88  AS  
 87澳门金沙vip 89  DEClARE   @AID   int,@BID int   
 88澳门金沙vip 90  —   创设工作Mm  
 89澳门金沙vip 91  BEGIN   TRANSACTION   InsertSome  
 90澳门金沙vip 92  INSERT   INTO   A   (dname)  
 91澳门金沙vip 93  VALUES   (@dname)     
 92澳门金沙vip 94  SET   @AID = @@IDENTITY   —   得到刚才扩大的Id     
 93澳门金沙vip 95  INSERT   INTO   B   (a_id, coutry)  
 94澳门金沙vip 96  VALUES   (@AID,@coutry) 
 95澳门金沙vip 97  SET   @BID = @@IDENTITY
 96澳门金沙vip 98    INSERT   INTO  C (b_id,ac_id,cname)  
 97澳门金沙vip 99  VALUES   (@BID,@AID,@cname) 
 98澳门金沙vip 100   
 99澳门金沙vip 101  —   假设有荒诞,回滚事务,不然提交业务  
100澳门金沙vip 102  IF   @@ERROR   >   0  
101澳门金沙vip 103  ROLLBACK   TRANSACTION   InsertSome  
102澳门金沙vip 104  ELSE  
103澳门金沙vip 105  COMMIT   TRANSACTION   InsertSome   
104澳门金沙vip 106GO
105澳门金沙vip 107
106澳门金沙vip 108exec sp_InsertMm ‘A2′,’B2′,’C2’
107澳门金沙vip 109
108澳门金沙vip 110select * from A
109澳门金沙vip 111select * from B
110澳门金沙vip 112select * from C
111澳门金沙vip 113select * from E
112澳门金沙vip 114  –删除测量检验遭遇  
113澳门金沙vip 115  drop   trigger   trg_A  
114澳门金沙vip 116  drop   table   A,B,C,E
115澳门金沙vip 117  drop procedure sp_InsertMm
116澳门金沙vip 118drop procedure sp_InsertMm1
117澳门金沙vip 119
118澳门金沙vip 120–循环的话,你能够用while,也足以用go,如:  
119澳门金沙vip 121  –1)  
120澳门金沙vip 122CREATE   PROCEDURE   sp_InsertMm1
121澳门金沙vip 123as
122澳门金沙vip 124  declare   @i   int,@count int
123澳门金沙vip 125  select @count=count(*) from E
124澳门金沙vip 126 — select @count
125澳门金沙vip 127  
126澳门金沙vip 128  set   @i   =   11000    
127澳门金沙vip 129  while   @i<=11000+@count  
128澳门金沙vip 130  begin  
129澳门金沙vip 131     –操作语句  
130澳门金沙vip 132DECLARE   @dname   varchar(20),@coutry   nvarchar(50),@cname varchar(50)
131澳门金沙vip 133DEClARE   @AID   int,@BID int 
132澳门金沙vip 134SELECT @dname=E_a  FROM E where E_id=@i
133澳门金沙vip 135SELECT @coutry=E_b  FROM E where E_id=@i
134澳门金沙vip 136SELECT @cname=E_c  FROM E where E_id=@i
135澳门金沙vip 137  —   创制工作Mm  
136澳门金沙vip 138  BEGIN   TRANSACTION   InsertSome  
137澳门金沙vip 139  INSERT   INTO   A   (dname)  
138澳门金沙vip 140  VALUES   (@dname)     
139澳门金沙vip 141  SET   @AID = @@IDENTITY   —   得到刚才扩充的Id     
140澳门金沙vip 142  INSERT   INTO   B   (a_id, coutry)  
141澳门金沙vip 143  VALUES   (@AID,@coutry) 
142澳门金沙vip 144  SET   @BID = @@IDENTITY
143澳门金沙vip 145    INSERT   INTO  C (b_id,ac_id,cname)  
144澳门金沙vip 146  VALUES   (@BID,@AID,@cname) 
145澳门金沙vip 147  —   借使有错误,回滚事务,不然提交业务  
146澳门金沙vip 148  IF   @@ERROR   >   0  
147澳门金沙vip 149  ROLLBACK   TRANSACTION   InsertSome  
148澳门金沙vip 150  ELSE  
149澳门金沙vip 151  COMMIT   TRANSACTION   InsertSome  
150澳门金沙vip 152      set   @i=@i+1  
151澳门金沙vip 153  end  
152澳门金沙vip 154 Go
153澳门金沙vip 155
154澳门金沙vip 156exec sp_InsertMm1
155澳门金沙vip 157  
156澳门金沙vip 158  –2)  
157澳门金沙vip 159  declare   @i   int  
158澳门金沙vip 160  set   @i=0  
159澳门金沙vip 161  xloop:–标签  
160澳门金沙vip 162  –操作  
161澳门金沙vip 163  set   @i=@i+1  
162澳门金沙vip 164   
163澳门金沙vip 165  if   @i<100 –剖断,当@i小于100的时候,回到操作推行处,继续试行  
164澳门金沙vip 166 goto   xloop
165澳门金沙vip 167
166澳门金沙vip 168澳门金沙vip 169/**//**********************************************************
167澳门金沙vip 170测量检验数据一个表的数码插入到多少个相关联表中,一条一条的插入
168澳门金沙vip 171—涂聚文 缔友Computer音信技艺有限公司 软件程序员 geovindu@163.com  www.dupcit.com 
169澳门金沙vip 172—捷为专门的学业室  涂聚文 www.dusystem.com  
170澳门金沙vip 173**********************************************************/

1 用于发生10条争辩数据

澳门金沙vip 174SET QUOTED_IDENTIFIER ON
澳门金沙vip 175GO
澳门金沙vip 176SET ANSI_NULLS ON
澳门金沙vip 177GO
澳门金沙vip 178
澳门金沙vip 179澳门金沙vip 180/**//*仓库储存进程,用于产生10条研究数据*/
澳门金沙vip 181
澳门金沙vip 182— — — — delete from reviews where operateID>15
澳门金沙vip 183— — — —
澳门金沙vip 184— — — — delete from contentinfos where ObjectType=5
澳门金沙vip 185
澳门金沙vip 186
澳门金沙vip 187ALTER       proc Create100Comments
澳门金沙vip 188as
澳门金沙vip 189declare @i int
澳门金沙vip 190declare @ContentID bigint
澳门金沙vip 191set @i=1
澳门金沙vip 192while @i<=10
澳门金沙vip 193begin
澳门金沙vip 194
澳门金沙vip 195        BEGIN TRAN
澳门金沙vip 196         if( @@error != 0 )
澳门金沙vip 197            goto ErrorHandler
澳门金沙vip 198        commit tran
澳门金沙vip 199
澳门金沙vip 200    INSERT INTO [ContentInfos]
澳门金沙vip 201        ( CategoryID,Source,
澳门金沙vip 202                    ObjectType,ClickCount,
澳门金沙vip 203                    ReviewCount,Grade,
澳门金沙vip 204                    VoteCount,CommendCount,
澳门金沙vip 205                    AuthorID,BlogID,
澳门金沙vip 206                    Size,CollectionTime,
澳门金沙vip 207                    IsActive,Keyword,
澳门金沙vip 208                    CollectionUser,OriginalID,
澳门金沙vip 209                    OriginalURL,F1,
澳门金沙vip 210                    F2,F3,
澳门金沙vip 211                    F4)
澳门金沙vip 212    VALUES
澳门金沙vip 213        ( 15,”,
澳门金沙vip 214                    5,100,
澳门金沙vip 215                    100,1000,
澳门金沙vip 216                    100,99,
澳门金沙vip 217                    54,204562,
澳门金沙vip 218                    10000,getdate(),
澳门金沙vip 219                    0,”,
澳门金沙vip 220                    ‘testuser’,999,
澳门金沙vip 221                    ‘testurl’,100,
澳门金沙vip 222                    100,”,
澳门金沙vip 223                    ”)
澳门金沙vip 224
澳门金沙vip 225    SET @ContentID = IDENT_CURRENT(‘ContentInfos’)
澳门金沙vip 226    INSERT INTO  Reviews (CellID ,  PortalID ,  UserID ,  ContentID ,  OperateTitle ,  OperateContent ,  OperateDateTime ,  BlogID ,  BlogTitle ,  OperateUserID ,  UserName ,  UserNick ,  CBlogName ,  OperateEmail ,  OperateIP ,  IsAnonymous ,  IsActive ,  OperateHomePage ,  OperateType ,  OperateValue )
澳门金沙vip 227        VALUES(@i, @i, @i, @ContentID, ‘操作题目’, ‘商量内容1<br>商议内容2<br>议论内容1<br><br><br><
 br>商酌内容2<br><br><br><br><br>议论内容2<
 br><br><br><br><br>商量内容4<br>’, getdate(卡塔尔, @i, ‘Blog标题’, @i, ‘客商名称’, ‘顾客呢称’, ‘Blog名称’, ‘test@126.com’, ‘124.458.135.500’, 0, 1, ”, 1, @i)
澳门金沙vip 228
澳门金沙vip 229
澳门金沙vip 230           
澳门金沙vip 231    if( @@error != 0 )
澳门金沙vip 232        goto ErrorHandler
澳门金沙vip 233
澳门金沙vip 234ErrorHandler:
澳门金沙vip 235    if( @@error != 0 )
澳门金沙vip 236    begin
澳门金沙vip 237        rollback tran
澳门金沙vip 238    end
澳门金沙vip 239set @i=@i+1
澳门金沙vip 240
澳门金沙vip 241end
澳门金沙vip 242
澳门金沙vip 243GO
澳门金沙vip 244SET QUOTED_IDENTIFIER OFF
澳门金沙vip 245GO
澳门金沙vip 246SET ANSI_NULLS ON
澳门金沙vip 247GO
澳门金沙vip 248

五个很常用的蕴藏进程