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

私はあなたの更新ステートメントを実行すると、あなたが

+0

なぜあなたは意図的にこのような値の区切りのリストを作成していますか?単一のタプルに値を重畳するのではなく、正規化された構造を使用する必要があります。それは長期的にあなたのために物事をより困難にします。データを作成するために必要なすべての操作を、クエリを実行するたびに取り消す必要があります。 –

+0

これはちょうど1時間のカーソルであり、私の最初のcurosorはそれらについてたくさん知っているわけではないので、コードが必要です。コメントを読むことで多くのことを理解できます:D –

+0

あなたは何をしていますか?テスト。これは、1つのセル(DB世界のタプルと呼ばれます)に複数の値がある場合、1NFに違反します。 –

答えて

0

を知っているだけのように文書IDの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); 
関連する問題