2016-07-21 1 views
0

Bon, j'ai ce curseur et il doit mettre à jour le test de colonne avec le résultat de la requête @sql. mais il ne met pas à jour chaque colonne avec son propre résultat de la requête, comme s'il n'exécutait pas cette requête pour chaque colonne, si vous me le demandiez.Le curseur ne fonctionne pas à travers la table entière

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 

Je peux rejoindre someTable avec damdocumenttype1 sur DocumentID, si vous le savez

+0

Pourquoi créez-vous intentionnellement une liste délimitée par des valeurs comme celle-ci? Vous devriez utiliser une structure normalisée au lieu de bachoter les valeurs dans un seul tuple. Cela rendra les choses plus difficiles pour vous à long terme. Tous les mouvements que vous devez effectuer pour créer les données que vous devrez annuler chaque fois que vous voulez l'interroger. –

+0

Ceci est juste un curseur de temps et c'est mon premier curosor je ne sais pas beaucoup sur eux, donc j'ai besoin d'un code, je ne comprends pas beaucoup en lisant votre commentaire: D –

+0

Ce que vous faites est de bourrer une liste délimitée par des virgules dans la colonne tester. Cela viole 1NF lorsque vous avez plusieurs valeurs dans une seule cellule (appelée un tuple dans le monde DB). –

Répondre

0

Quand vous faites votre déclaration de mise à jour:

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

fetch next from c1 into @var,@promenjiva 

Vous n'utilisez une clause where. Donc vous mettez à jour toute la table. Je suppose que vous voulez:

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

Vous n'avez probablement pas besoin d'un curseur ici. Si vous postez votre code complet, quelqu'un devrait être capable de le réécrire d'une manière basée sur un ensemble, ce qui fonctionnera beaucoup mieux.


ADDENDA

Les éléments suivants devraient obtenir le même résultat sans avoir recours à des boucles:

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