2016-07-21 5 views
0

커서가 있습니다. @sql 쿼리의 결과로 열 테스트를 업데이트해야합니다. 하지만 그것은 각각의 열을 쿼리의 자체 결과로 업데이트하지 않습니다. 그럴 경우, 각 열에 대해 해당 쿼리를 실행하지 않아도됩니다.커서가 전체 테이블을 돌지 못합니다.

declare @promenjiva nvarchar(max) 
declare @docidgodina nvarchar(max) 
declare @sql nvarchar(max) 
declare @var int 
declare @var1 int 

declare c1 cursor for 

select documentid,a4 from damdocumenttype1 order by documentid--a inner join dbo.Delovodnik b on a.documentid=b.idinstance 

begin 
open c1; 

fetch next from c1 into @var,@promenjiva 
while @@fetch_status = 0 
begin 
set @promenjiva=REPLACE(@promenjiva,'C','') 
SET @SQL = 'select stuff((
      SELECT '', '' + a1 
      FROM DamDocumentType1 
      where documentid in (' + @promenjiva + ') 
      FOR XML path('''') 
      ), 1, 2, '''')' 
exec @docidgodina=sp_executesql @sql 
update dbo.Delovodnik set [email protected] 

fetch next from c1 into @var,@promenjiva 

end 

end 
close c1 
deallocate c1 

난 당신이 UPDATE 문을 수행 할 때 당신이

+0

왜 당신이 의도적으로 같은 값의 구분 된 목록을 작성? 단일 튜플에 값을 밀어 넣는 대신 정규화 된 구조를 사용해야합니다. 장기적으로 볼 때 상황이 더 어려워 질 것입니다. 데이터를 작성하기 위해 거쳐야하는 모든 작업은 쿼리 할 때마다 실행 취소해야합니다. –

+0

이것은 단지 한 시간의 커서이며, 나의 첫 번째 curosor는 그들에 대해 많이 모른다. 그래서 나는 코드가 필요하다. 나는 당신이 읽고있는 것을 많이 읽고 이해한다 : D –

+0

쉼표로 구분 된 목록을 열에 채운다. 테스트. 단일 셀 (DB 세계에서 튜플이라고 함)에서 값이 여러 개일 때 1NF를 위반합니다. –

답변

0

을 알겠지만, documentid에 damdocumenttype1와 someTable에 가입 ​​할 수 있습니다 :

SET @SQL = --some sql query... 
update someTable set [email protected] 

fetch next from c1 into @var,@promenjiva 

당신은 where 절을 사용하지 마십시오. 그래서 전체 테이블을 업데이트합니다. 당신이 원하는 것 같습니다 :

UPDATE SomeTable 
SET  Test = @sql 
WHERE DocumentID = @Var; 

거의 확실하게 여기 커서가 필요 없습니다. 전체 코드를 게시하면 다른 사람이 세트 기반 방식으로이 코드를 다시 작성할 수 있어야합니다.


부칙

루프를 필요로하지 않고 동일한 결과를 달성해야 다음 :

UPDATE d 
SET  Test = STUFF(dt.docidgodina.value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
FROM dbo.Delovodnik AS d 
     CROSS APPLY 
     ( SELECT CONCAT(',', a1) 
      FROM dbo.DamDocumentType1 AS dt 
      WHERE CONCAT(',', REPLACE(d.a4, 'C', ''), ',') LIKE CONCAT('%,' + dt.DocumentID + ',%') 
      FOR XML PATH(''), TYPE 
     ) AS dt (docidgodina);