OpenQuery 7320 7357 işlevini kullanarak uzak bir tabloda Transact-SQL deyimini GÜNCELLEŞTIRME, ekleme veya SILME işlemi gerçekleştirdiğinizde hata iletileri


Belirtiler


Verileri aşağıdaki şekilde güncelleştirmek, silmek veya eklemek için OPENQUERY işlevini kullanan dağıtılmış sorgular
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')
aşağıdaki hata iletilerini oluşturabilir:
Sunucu: Ileti 7357, düzey 16, durum 2, satır 1 ' güncelleştirme testbağlantılı kümesi SSN = SSN ' nesnesini işleyemedi. OLE DB sağlayıcısı ' SQLOLEDB ' nesnenin sütun içermediğini belirtir. Sunucu: Ileti 7357, düzey 16, durum 2, satır 1 [Microsoft] [ODBC SQL Server sürücüsü] [SQL Server] OLE DB sağlayıcısı ' MSDASQL ', nesnenin sütun içermediğini gösterir.
Hatanın gerçek metin iletisi OLE DB sağlayıcısına bağlı olarak değişebilir, ancak işlem (GÜNCELLEŞTIRME, ekleme veya SILME), ancak hata numarası daima 7357. Microsoft SQL Server 2005 kullanıyorsanız, aşağıdaki hata iletisini alırsınız:
Sunucu: Ileti 7357, düzey 16, durum 2, satır 1 "testlinkli kümesi SSN = SSN" nesnesini işleyemiyor. "ServerName" bağlantılı sunucusunun "SQLOLEDB" OLE DB sağlayıcısı, nesnede sütun olmadığını veya geçerli kullanıcının söz konusu nesne için izinleri olmadığını gösterir.

Neden


OPENQUERY bir sonuç kümesinin döndürülmesini gerektirir, ancak OPENQUERY Ile kullanılan Update, DELETE ve INSERT deyimleri bir sonuç kümesi döndürmez.

Geçici Çözüm


Aşağıdaki yollarla bu soruna geçici bir çözüm bulabilirsiniz:
  1. Ekleme, güncelleştirme veya silme işlemleri yapmak için dört bölümlü adlar kullanın (linked_server_name. Catalog. Schema. object_name).
  2. SQL Server Books Online 'da belgelendiği gibi, OLE DB sağlayıcısının yeteneklerine tabi olarak, bir INSERT, UPDATE veya DELETE deyiminin hedef tablosu olarak OPENQUERY işlevini ifade edin. Aşağıdaki sorgular SQL Server OLE DB sağlayıcısı ile uygun kullanımı gösterir:
    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')
    Not Ekle deyiminde, uzak sunucudan veri almayı önlemek için WHERE 1 = 0 yüklemi kullanılır; Bu da performansı düşürür. Ayrıca, GÜNCELLEŞTIRME ve SILME işlemlerinde özel dizin gereksinimleri vardır; Ayrıntılar için "daha fazla bilgi" bölümüne bakın.

Ek Bilgi


Benzersiz dizin gereksinimi

SQL Server OLE DB sağlayıcısı, GÜNCELLEŞTIRME veya SILME işlemleri için temel alınan tabloda benzersiz bir dizinin bulunmasını gerektirir. Uzak tabloda benzersiz bir dizin yoksa, bir GÜNCELLEŞTIRME veya SILME işlemi denendiğinde aşağıdaki hata oluşur:
Sunucu: Ileti 7320, düzey 16, durum 2, satır 1 ' SQLOLEDB ' OLE DB sağlayıcısına karşı sorguyu çalıştıramadı. Sağlayıcı, gerekli bir satır arama arabirimini desteklemiyor. Sağlayıcı diğer özellikler veya gerekliliklerde çakışmaların oluştuğunu gösterir. [OLE/DB sağlayıcı ileti döndürdü: çok adımlı OLE DB işlemi hatalar oluşturdu. Varsa, her OLE DB durum değerini denetleyin. İş yapılmaz.
Bu hem OPENQUERY hem de dört BÖLÜMLÜ adlandırılmış GÜNCELLEŞTIRME ve silme işlemlerine uygulanır. Uzak tabloya benzersiz bir dizin eklenerek sorun çözüldü.

OpenQuery ile dinamik yürütme

Bazen, aşağıdaki örnekte gösterildiği gibi, OPENQUERYkullanarak aynı etkiye ulaşmak için dinamik bir sorgu kullanmak istenebilir:
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