Oprava: Aktualizovat S vlastní spojení může aktualizovat nesprávný počet řádků

Překlady článku Překlady článku
ID článku: 285870 - Produkty, které se vztahují k tomuto článku.
CHYBA Č: 101111 (SQLBUG_70)
Chyba #: 351761 (SHILOH_bugs)
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Operace UPDATE není může upravit správný počet řádků, pokud jsou splněny následující podmínky:
  • Dotaz aktualizuje sloupec, ColA, z tabulky TabA.
  • Dotaz odkazuje TabA znovu, použití aliasu TabB.
  • Je odkaz TabB.ColA někde v dotazu.
  • Nejsou žádné aktualizované TabA sloupců indexovaného sloupce.
  • Je použit algoritmus hash nebo korespondence spojení.

Příčina

Plán dotazu nemusí zahrnovat nezbytné Spool tabulky pod UPDATE operátor, který je nutné poskytnout masopustními zámek.

Řešení

SQL Server 2000

Tento problém vyřešíte získat nejnovější aktualizaci service pack pro 2000 Microsoft SQL Server. Další informace získáte v následujícím článku znalostní báze Microsoft Knowledge Base:
290211INF: Jak získat nejnovější aktualizaci Service Pack pro SQL Server 2000

SQL Server 7.0

Tento problém vyřešíte získat nejnovější aktualizaci service pack pro Microsoft SQL Server 7.0. Další informace získáte v následujícím článku znalostní báze Microsoft Knowledge Base:
301511INF: Jak získat nejnovější aktualizaci Service Pack pro SQL Server 7.0


Poznámka: Tato oprava hotfix následující vytvořeného před instalací Microsoft SQL Server 7.0 Service Pack 4.

Anglická verze této opravy má následující atributy souborů nebo novější:
   Version      File name       Platform
   -------------------------------------

   7.00.978     s70978i.exe     x86
   7.00.978     s70978a.exe     Alpha
				
Poznámka: Vzhledem k závislostem souborů nejnovější opravy hotfix nebo funkce, která obsahuje předchozí soubory může také obsahovat další soubory.

Jak potíže obejít

Chcete-li vyřešit tento problém:
  • Vynutit spojení smyčky pomocí OPTION (LOOP JOIN).

    Nebo

  • Přidat index na aktualizované sloupce.

Prohlášení

Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny na začátku tohoto článku.

SQL Server 2000
Tento problém byl poprvé opraven v SQL Server 2000 Service Pack 1.

SQL Server 7.0
Tento problém byl poprvé opraven v Microsoft SQL Server 7.0 Service Pack 4.

Další informace

Přijď ochrany je nutný k situaci, kde se fyzické umístění řádek v tabulce změní kvůli operace UPDATE zabránit. V důsledku toho stejného řádku může být revisited vícekrát v rámci kontextu jedné logické operace, které by nemělo dojít. Pokud jsou splněny podmínky pro tuto konkrétní chybu, může Optimalizátor serveru SQL není sestavit plán s odpovídající ochranu masopustními.

Následující příklad znázorňuje problém:
set nocount on
create table test(id int, pid int, fn varchar(256), rn varchar(8))
go
declare @c int
set @c = 1
insert into test values(0, NULL, 'root', 'root')
while @c < 10
begin
   insert into test values(@c, @c-1, NULL, cast(@c as varchar(8)))
   set @c = @c + 1
end
create unique clustered index idx_c_id on test(id)
go
update test
set fn = parent.fn + '/' + test.rn
from test(index=0) , test parent(index=0)
where test.pid = parent.id and test.fn is NULL --  and parent.fn <> ''
option(hash join,force order)
				
Zde jsou správné obsah tabulky po aktualizaci:

--SPRÁVNÉ výsledky:
id          pid         rn       fn                                                                                                                                                                                                                                                               
----------- ----------- -------- ---- 
0           NULL        root     root
1           0           1        root/1
				
Zde jsou výsledky získat před k použití Oprava:

--NESPRÁVNÉ výsledky:
id          pid         rn       fn                                                                                                                                                                                                                                                               
----------- ----------- -------- ----
0           NULL        root     root
1           0           1        root/1
2           1           2        root/1/2
3           2           3        root/1/2/3
4           3           4        root/1/2/3/4
5           4           5        root/1/2/3/4/5
6           5           6        root/1/2/3/4/5/6
7           6           7        root/1/2/3/4/5/6/7
8           7           8        root/1/2/3/4/5/6/7/8
9           8           9        root/1/2/3/4/5/6/7/8/9

				

Vlastnosti

ID článku: 285870 - Poslední aktualizace: 28. října 2003 - Revize: 3.1
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Klíčová slova: 
kbmt kbbug kbfix KB285870 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:285870

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com