Foutberichten wanneer u een UPDATE, INSERT of DELETE Transact-SQL-instructie uitvoert voor een externe tabel met behulp van de functie QueryOpenen: ' 7357 ' en ' 7320 '

Gedistribueerde query's die gebruikmaken van de functie QueryOpenen om gegevens op de volgende manier bij te werken, te verwijderen of in te voegen

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

kan de volgende foutberichten genereren:

Server: msg 7357, niveau 16, status 2, lijn 1 konden object ' update testlinked set = SSN ' niet verwerken. Met de OLE DB-provider ' SQLOLEDB ' wordt aangegeven dat het object geen kolommen bevat. Server: msg 7357, niveau 16, status 2, line 1 [Microsoft] [ODBC SQL Server Driver] [SQL Server] kon object ' update testlinked set ' SSN = SSN ' instellen. Met de OLE DB-provider ' MSDASQL ' wordt aangegeven dat het object geen kolommen bevat.

Het feitelijke SMS-bericht van de fout kan variƫren, afhankelijk van de OLE DB-provider en de bewerking (bijwerken, invoegen of verwijderen) die wordt uitgevoerd, maar het foutnummer is altijd 7357. Als u Microsoft SQL Server 2005 gebruikt, wordt het volgende foutbericht weergegeven:

Server: msg 7357, niveau 16, status 2, regel 1 kan het object niet verwerken ' update testlinked set SSN = SSN '. De OLE DB-provider "SQLOLEDB" voor gekoppelde server "servernaam" geeft aan dat het object geen kolommen bevat of dat de huidige gebruiker geen machtigingen heeft voor dat object.

Voor de query OpenQuery is een resultatenset vereist, maar de instructies update, DELETE en insert die worden gebruikt met QueryOpenen , retourneren geen resultatenset.

U kunt dit probleem op de volgende manieren omzeilen:

  1. Gebruik vierkante namen (linked_server_name. catalog. schema. object_name) om bewerkingen in te voegen, bij te werken of te verwijderen.

  2. Zoals beschreven in SQL Server Books Online, verwijst u naar de functie QueryOpenen als doeltabel van een insert-, update-of DELETE-instructie, onderworpen aan de mogelijkheden van de OLE DB-provider. De volgende query's illustreren het juiste gebruik met de SQL Server OLE DB-provider:

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

    Opmerking In de instructie INSERT wordt met 1 = predicaat een predicaat gebruikt om te voorkomen dat gegevens van de externe server worden opgehaald, wat kan leiden tot trage prestaties. Daarnaast gelden voor UPDATE-en verwijderbewerkingen speciale index vereisten. Zie de sectie ' meer informatie ' voor meer informatie.

Voor de SQL Server OLE DB-provider moet een unieke index bestaan voor de onderliggende tabel voor BIJWERK-of verwijderbewerkingen. Als een externe tabel geen unieke index bevat, treedt de volgende fout op wanneer een UPDATE of verwijdering wordt geprobeerd:

Server: msg 7320, niveau 16, status 2, regel 1 kon query niet uitvoeren voor OLE DB-provider ' SQLOLEDB '. De provider kon een vereiste zoekinterface voor de rij niet ondersteunen. De provider geeft aan dat er conflicten zijn opgetreden met andere eigenschappen of vereisten. [OLE/DB-provider heeft bericht geretourneerd: fout: bewerking met meerdere stappen gegenereerde fouten. Controleer elke OLE DB-statuswaarde, indien beschikbaar. Er is geen werk gedaan.

Dit geldt voor zowel een BIJWERK -als een vierdelige naam van een update en een verwijderbewerking. Het probleem wordt verholpen door een unieke index toe te voegen aan de tabel Remote.

Het kan soms wenselijk zijn een dynamische query te gebruiken om hetzelfde effect te verkrijgen met OpenQuery, zoals in het volgende voorbeeld wordt weergegeven:

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

Meer hulp nodig?

Uw vaardigheden uitbreiden
Training verkennen
Als eerste nieuwe functies krijgen
Deelnemen aan Microsoft insiders

Was deze informatie nuttig?

Hoe tevreden bent u met de vertaalkwaliteit?

Wat heeft uw ervaring beïnvloed?

Hebt u aanvullende feedback? (Optioneel)

Bedankt voor uw feedback.

×