好的,我得到了这个游标,它需要使用@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上加入somedable with damdocumenttype1,这样你才知道
答案 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);