Chybové hlásenia pri vykonaní aktualizácie, vložiť alebo odstrániť príkaz Transact-SQL vo vzdialenej tabuľke pomocou funkcie OtvoriťDotaz: "7357" a "7320"

Príznaky

Distribuované dotazy, ktoré používajú funkciu OtvoriťDotaz na aktualizáciu, odstránenie alebo vloženie údajov nasledujúcim spôsobom

exec sp_dropserver 'linked1', 'droplogins'exec sp_addlinkedserver 'linked1', 'SQL Server'exec sp_setnetname  'linked1', '<servername>'exec sp_addlinkedsrvlogin 'linked1', 'false', null, '<login name>', '<password>'SET ANSI_NULLS ONgoSET ANSI_WARNINGS ONgoselect * from openquery (linked1, 'update testlinked set ssn=ssn+1')select * from openquery (linked1, 'insert into  testlinked  (ssn) values (1000)')select * from openquery (linked1, 'delete from  testlinked  where ssn=1')

môže generovať nasledujúce chybové hlásenia:

Server: Msg 7357, úroveň 16, štát 2, čiara 1 nemohol spracovať objekt ' Update testlinked set SSN = SSN '. Poskytovateľ OLE DB Provider ' SQLOLEDB ' označuje, že objekt neobsahuje žiadne stĺpce. Server: Msg 7357, úroveň 16, štát 2, čiara 1 [Microsoft] [ODBC SQL Server Driver] [SQL Server] nemohol spracovať objekt ' Update testlinked set SSN = SSN '. Poskytovateľ OLE DB Provider ' MSDASQL ' označuje, že objekt neobsahuje žiadne stĺpce.

Skutočná textová správa o chybe sa môže líšiť v závislosti od poskytovateľa OLE DB a vykonanej operácie (aktualizácie, vloženia alebo odstránenia), no číslo chyby je vždy 7357. Ak používate Microsoft SQL Server 2005, zobrazí sa toto chybové hlásenie:

Server: Msg 7357, úroveň 16, štát 2, položka 1 nemôže spracovať objekt "Update testlinked set SSN = SSN". Poskytovateľ OLE DB "SQLOLEDB" pre prepojený server "názov_servera" označuje, že objekt neobsahuje žiadne stĺpce alebo aktuálny používateľ nemá povolenia pre daný objekt.

Príčina

OtvoriťDotaz vyžaduje, aby sa vrátila množina výsledkov, ale položky aktualizovať, odstrániť a vložiť, ktoré sa používajú s OtvoriťDotaz , nevracajú množinu výsledkov.

Alternatívne riešenie

Tento problém môžete obísť nasledujúcimi spôsobmi:

  1. Ak chcete vložiť, aktualizovať alebo odstrániť operácie, použite názvy štyroch častí (linked_server_name. Catalog. Schema. object_name).

  2. Ako je uvedené v službe SQL Server Books Online, odkazujú na funkciu OtvoriťDotaz ako cieľovú tabuľku príkazu Insert, Update alebo Delete s výhradou možností poskytovateľa OLE DB. Nasledujúce dotazy preukazujú správne používanie s poskytovateľom OLE DB SQL servera:

    update openquery(linked1, 'select ssn from testlinked where ssn=2')set ssn=ssn + 1insert openquery(linked1, 'select ssn from testlinked where 1=0') values (1000)delete openquery(linked1, 'select ssn from testlinked where ssn>100')

    Poznámka: V príkaze vložiť, kde sa používa 1 = 0 predikát, aby sa predišlo načítaniu údajov zo vzdialeného servera, čo môže mať za následok pomalší výkon. Operácie s AKTUALIZÁCIAmi a ODSTRAŇOVAním majú tiež špeciálne požiadavky na indexovanie. Podrobnosti nájdete v časti Ďalšie informácie.

Ďalšie informácie

Požiadavka na jedinečný index

Poskytovateľ SQL servera OLE DB vyžaduje, aby sa v podkladovej tabuľke nachádzal jedinečný index pre operácie aktualizácie alebo odstránenia. Ak na vzdialenej tabuľke neexistuje žiadny jedinečný index, pri pokuse o aktualizáciu alebo odstránenie sa zobrazí táto chyba:

Server: Msg 7320, úroveň 16, štát 2, čiara 1 sa nepodarilo spustiť dotaz voči poskytovateľovi OLE DB Provider ' SQLOLEDB '. Poskytovateľ nemohol podporovať povinné rozhranie vyhľadávania riadkov. Poskytovateľ označuje, že sa vyskytli konflikty s inými vlastnosťami alebo požiadavkami. [Poskytovateľ OLE/DB vrátil správu: operácie s viacerými krokmi OLE DB vygenerované chyby. Skontrolujte každú hodnotu stavu OLE DB (ak je k dispozícii). Žiadna práca nebola dokončená.

Toto sa vzťahuje na OtvoriťDotaz aj štyri časti s názvom aktualizácia a odstrániť operácie. Problém je vyriešený pridaním jedinečného indexu na vzdialenú tabuľku.

Dynamická realizácia s OtvoriťDotaz

Niekedy môže byť žiaduce použiť dynamický dotaz na dosiahnutie rovnakého efektu pomocou OtvoriťDotaz, ako je znázornené v nasledujúcom príklade:

begin tranSET QUOTED_IDENTIFIER OFFSET XACT_ABORT ONdeclare @cmd varchar(2500) declare @cmd1 varchar(2500) declare @var varchar(20) set @var = 'White' declare @var1 varchar(20) set @var1 = 'White1' declare @var2 varchar(20) set @var2 = 'Johnson1'select @cmd = "Update openquery(linked1,'select au_lname, au_fname from pubs.dbo.authorswhere au_lname = ''" + @var + "''' )set au_lname = '" + @var1 + "',au_fname = '" + @var2 + "'"exec ( @cmd )commit transelect * from <servername>.pubs.dbo.authors

Potrebujete ďalšiu pomoc?

Rozšírte svoje zručnosti
Preskúmať školenie
Buďte medzi prvými, ktorí získajú nové funkcie
Pripojiť k Microsoft insiderov chcú

Považujete poskytnuté informácie za užitočné?

Ďakujem za vaše pripomienky!

Ďakujeme vám za pripomienky. Pravdepodobne vám pomôže, ak vás spojíme s pracovníkom podpory pre Office.

×