2016-07-21 105 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 

我可以加入someTable與documentid damdocumenttype1,只是讓你知道

+0

你爲什麼要故意製造這樣的值的分隔列表?您應該使用規範化的結構,而不是將值填充到單個元組中。從長遠來看,這會讓事情變得更加困難。所有你必須通過創建數據的迴轉,你將不得不撤消每一次你想查詢它。 –

+0

這只是一次光標和我的第一個curosor我不知道很多關於它們,所以我需要一個代碼,我不知道通過閱讀你的評論瞭解很多:D –

+0

你在做什麼是填充逗號分隔列表到列測試。當您在單個單元格中創建多個值(在數據庫世界中稱爲元組)時,這會違反1NF。 –

回答

0

當你做你的更新語句:

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);