游标不会通过整个表运行

时间:2016-07-21 12:46:12

标签: sql-server sql-server-2008 sql-server-2005

好的,我得到了这个游标,它需要使用@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 test=@docidgodina

fetch next from c1 into @var,@promenjiva

end

end
close c1
deallocate c1

我可以在documentid上加入somedab​​le with damdocumenttype1,这样你才知道

1 个答案:

答案 0 :(得分:0)

执行更新声明时:

SET @SQL = --some sql query...
update someTable set test=@sql

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