Kļūdas ziņojumi, veicot atjaunināšanu, IEVIETOjot vai DZĒŠOT Transact-SQL priekšrakstu attālajā tabulā, izmantojot funkciju OpenQuery: "7357" un "7320"

Simptomi

Izdalītie vaicājumi, kas izmanto funkciju OpenQuery , lai atjauninātu, dzēstu vai ievietotu datus tālāk norādītajā veidā

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

var ģenerēt šādus kļūdas ziņojumus:

Server: MSG 7357, Level 16, State 2, Line 1 nevarēja apstrādāt objekta "Update testlinked Set SSN = SSN". OLE DB pakalpojumu sniedzēja ' SQLOLEDB ' norāda, ka objektam nav kolonnu. Server: MSG 7357, Level 16, State 2, Line 1 [Microsoft] [ODBC SQL Server Driver] [SQL Server] nevarēja apstrādāt objekta "Update testlinked Set SSN = SSN". OLE DB pakalpojumu sniedzēja ' MSDASQL ' norāda, ka objektam nav kolonnu.

Faktiskais kļūdas ziņojuma teksts var atšķirties atkarībā no OLE DB nodrošinātāja un operācijas (atjaunināšanas, ievietošanas vai dzēšanas), bet kļūdas numurs vienmēr ir 7357. Ja izmantojat Microsoft SQL Server 2005, tiek parādīts šāds kļūdas ziņojums:

Server: MSG 7357, Level 16, State 2, Line 1 nevar apstrādāt objektu "Update testlinked Set SSN = SSN". OLE DB nodrošinātājs "SQLOLEDB" ar saistīto serveri "servera nosaukums" norāda, ka objektam nav kolonnu vai pašreizējam lietotājam nav atļaujas šajā objektā.

Cēlonis

OpenQuery ir nepieciešama rezultātu kopa, bet, lai atjauninātu, dzēstu un ievietotu priekšrakstus, kas tiek izmantoti kopā ar OpenQuery , netiek atgriezta rezultātu kopa.

Risinājums

Šo problēmu var novērst, veicot tālāk norādītās darbības.

  1. Izmantojiet četrciparu nosaukumus (linked_server_name. Catalog. Schema. object_name), lai veiktu ievietošanas, atjaunināšanas vai dzēšanas darbības.

  2. Kā dokumentēts SQL Server grāmatās tiešsaistē, atsaukties uz funkciju OpenQuery kā ievietošanas, atjaunināšanas vai dzēšanas atskaites tabulu, ņemot vērā OLE DB nodrošinātāja iespējas. Tālāk norādītie vaicājumi demonstrē atbilstošu lietojumu ar SQL Server OLE DB nodrošinātāju:

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

    Piezīme. Priekšrakstā INSERT, kur 1 = 0 predikāts, tiek izmantots, lai neļautu izgūt datus no attālā servera, kas var izraisīt lēnāku veiktspēju. Arī atjaunināšanas un dzēšanas darbībām ir īpašas indeksācijas prasības; Papildinformāciju skatiet sadaļā "Papildinformācija".

Papildinformācija

Unikālā indeksa prasība

SQL Server OLE DB pakalpojumu sniedzējam ir nepieciešams, lai tiktu parādīts unikāls indekss, kas paredzēts atjaunināšanas vai dzēšanas darbībām. Ja attālajā tabulā nav unikālā indeksa, tiek parādīts šāds kļūdas ziņojums:

Server: MSG 7320, Level 16, State 2, Line 1 nevar izpildīt vaicājumu, izmantojot OLE DB pakalpojumu sniedzēju ' SQLOLEDB '. Nodrošinātājs neatbalsta nepieciešamo rindas uzmeklēšanas interfeisu. Nodrošinātājs norāda, ka konflikti ir radušies ar citiem rekvizītiem vai prasībām. [OLE/DB nodrošinātājs atgrieza ziņojumu: vairāku darbību OLE DB darbību ģenerētās kļūdas. Pārbaudiet katru OLE DB statusa vērtību, ja tā ir pieejama. Darbs netika veikts.

Tas attiecas gan uz OpenQuery , gan uz četriem-Part nosaukts Update un Delete Operations. Šī problēma ir novērsta, pievienojot unikālu indeksu attālajā tabulā.

Dinamiskā izpilde ar OpenQuery

Dažkārt var būt vēlams izmantot dinamisku vaicājumu, lai sasniegtu tādu pašu efektu, izmantojot OpenQuery, kā parādīts tālāk esošajā piemērā.

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

Vai nepieciešama papildu palīdzība?

Paplašiniet savas prasmes
Iepazīties ar apmācību
Esiet pirmais, kas saņem jaunās iespējas
Pievienoties Microsoft Insider

Vai šī informācija bija noderīga?

Paldies par jūsu atsauksmēm!

Paldies par atsauksmēm! Šķiet, ka jums varētu būt noderīgi sazināties ar kādu no mūsu Office atbalsta speciālistiem.

×