2012-07-08 80 views
1

在我的T-SQL代码,我使用WITH从表中读取数据。看完后,我想用WHILE摆脱WITH结果项(第一项,第二项,...),并从中删除项目。如何使用循环(WHILE语句)的“WITH”子句的结果(TSQL)?

请看看我的代码:

With Rep(SubjectId) As 
(
    SELECT [SubjectID] FROM [BookSubjects] 
     WHERE [BookID] = @BookID 
) 
WHILE EXISTS(SELECT [SubjectID] FROM Rep) 
BEGIN 
     SELECT @SubjectID = SubjectID FROM Rep   
     SELECT @Result = @Result + CAST(@SubjectID AS varchar(10)) 
     DELETE FROM Rep WHERE SubjectID = @SubjectID 
END 

我想我不能删除项目从WITH的结果!但我的另一个问题是,我如何才能identity(1,1)列设置为WITH参数?

中声明临时表,我用这个:

@ID Int Identity(1,1) 

我如何定义身份WITH参数?

回答

2

我认为你正在寻找的财产以后这样 :

create table BookSubjects(SubjectID int,BookID int) 
insert into BookSubjects(SubjectID ,BookID) values(1,10) 
insert into BookSubjects(SubjectID ,BookID) values(2,20) 
insert into BookSubjects(SubjectID ,BookID) values(3,30) 
insert into BookSubjects(SubjectID ,BookID) values(4,40) 
insert into BookSubjects(SubjectID ,BookID) values(5,50) 
insert into BookSubjects(SubjectID ,BookID) values(6,60) 
insert into BookSubjects(SubjectID ,BookID) values(2,10) 
insert into BookSubjects(SubjectID ,BookID) values(2,10) 
insert into BookSubjects(SubjectID ,BookID) values(3,10) 
insert into BookSubjects(SubjectID ,BookID) values(4,10) 
insert into BookSubjects(SubjectID ,BookID) values(5,10) 
insert into BookSubjects(SubjectID ,BookID) values(6,10) 

select * from BookSubjects 



     ;With Rep As 
     (
      SELECT [SubjectID],[BookID] FROM [BookSubjects] 
      WHERE [BookID] = 10 
     ) 
     , Rep1 As 
     (
     select 
     [BookID], 
     stuff((
      select ',' + cast(t.[SubjectID] as varchar(100)) 
      from Rep t 
      where Rep.[BookID] = t.[BookID] 
      order by t.[SubjectID] 
      for xml path('') 
     ),1,1,'') as name_csv 
     from Rep 
     group by [BookID] 

     ) 
     select * from rep1 

我在第二个用另一种随着第一条后的带(命名REP1) 我转换行返回两个逗号塞佩额定colomn。 你可以改变你的需要。

+0

原代码删除条目... – Lucero 2012-07-09 01:14:07

1

通用表表达式(WITH ...)只能先单SELECTUPDATEINSERTDELETEMERGE语句。但是,你的代码似乎对于它的功能非常复杂。

这应该做同样的代码,但它是非常有效得多:

DECLARE @delSubjects TABLE (
    id int NOT NULL 
); 
DELETE BookSubjects 
    OUTPUT DELETED.SubjectID INTO @delSubjects 
    WHERE [email protected]; 
SET @result = (
    SELECT id+' ' 
    FROM @delSubjects 
    FOR XML PATH('') 
); 

Link to Fiddle