आप OpenQuery फ़ंक्शन का उपयोग कर किसी दूरस्थ तालिका पर कोई अद्यतन, सम्मिलित करें या हटाएँ Transact-SQL कथन निष्पादित करते समय त्रुटि संदेश: "7357" और "7320"


लक्षण


वितरित क्वेरीज़ को अद्यतन, हटाएँ, या निम्नलिखित तरीके में डेटा सम्मिलित करने के लिए OpenQuery फ़ंक्शन का उपयोग करें
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 ON
go
SET ANSI_WARNINGS ON
go
select * 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')
निम्न त्रुटि संदेश जनरेट हो सकता है:
सर्वर: संदेश 7357, स्तर 16, स्थिति 2, पंक्ति 1 ऑब्जेक्ट संसाधित नहीं कर सका ' अद्यतन testlinked सेट फ़ोन नंबर फ़ोन नंबर ='। OLE DB प्रदाता 'SQLOLEDB' कि ऑब्जेक्ट कोई स्तंभ नहीं है इंगित करता है।

सर्वर: संदेश 7357, स्तर 16, स्थिति 2, पंक्ति 1 [Microsoft] [ODBC SQL Server ड्राइवर] [SQL Server] ऑब्जेक्ट संसाधित नहीं कर सका ' अद्यतन testlinked सेट फ़ोन नंबर फ़ोन नंबर ='। OLE DB प्रदाता 'MSDASQL' कि ऑब्जेक्ट कोई स्तंभ नहीं है इंगित करता है।
त्रुटि के वास्तविक पाठ संदेश अलग अलग हो सकता है OLE DB प्रदाता और कार्रवाई (अद्यतन, सम्मिलित करें या DELETE) के आधार पर किया जा रहा है, लेकिन त्रुटि संख्या है हमेशा 7357।

यदि आप Microsoft SQL Server 2005 का उपयोग कर रहे हैं, तो आपको निम्न त्रुटि संदेश प्राप्त होता है:
सर्वर: संदेश 7357, स्तर 16, स्थिति 2, पंक्ति 1 ऑब्जेक्ट संसाधित नहीं कर सकता "अद्यतन testlinked सेट फ़ोन नंबर फ़ोन नंबर ="। "ServerName" लिंक किए गए सर्वर के लिए OLE DB प्रदाता "SQLOLEDB" इंगित करता है कि या तो ऑब्जेक्ट में कोई स्तंभ नहीं है या वर्तमान उपयोगकर्ता उस ऑब्जेक्ट पर अनुमतियाँ के पास नहीं है।

कारण


OpenQuery कोई परिणाम वापस हो करने के लिए सेट की आवश्यकता होती है, लेकिन OpenQuery के साथ उपयोग किए गए अद्यतन, हटाएँ और सम्मिलित करें कथन परिणाम सेट वापस नहीं है।

वैकल्पिक हल


आप निम्न तरीकों से इस समस्या को हल काम कर सकते हैं:
  1. सम्मिलित करें, अद्यतन करें या हटाएँ कार्रवाई करने के लिए four-part (linked_server_name.catalog.schema.object_name) नाम का उपयोग करें।
  2. SQL सर्वर पुस्तकें ऑनलाइन में दर्ज़ के रूप में, OpenQuery फ़ंक्शन किसी सम्मिलित करें, अद्यतन, लक्ष्य तालिका के रूप में संदर्भित या OLE DB प्रदाता की क्षमताओं अंतर्गत, कथन हटाएँ। निम्न क्वेरी SQL Server OLE DB प्रदाता के साथ उचित उपयोग है:
    update openquery(linked1, 'select ssn from testlinked where ssn=2')
    set ssn=ssn + 1
    insert openquery(linked1, 'select ssn from testlinked where 1=0') values (1000)
    delete openquery(linked1, 'select ssn from testlinked where ssn>100')
    नोट सम्मिलित करें कथन में एक जहाँ 1 = 0 predicate है धीमी कार्यक्षमता में परिणाम कर सकते हैं जो दूरस्थ सर्वर से डेटा को पुनर्प्राप्त करने से बचने के लिए उपयोग किया जाता है। साथ ही, अद्यतन, और DELETE कार्रवाई विशेष अनुक्रमणिका आवश्यकताएँ हैं; विवरण के लिए "अधिक जानकारी" अनुभाग देखें।

अधिक जानकारी


अनन्य अनुक्रमणिका आवश्यकताएँ

SQL सर्वर OLE DB प्रदाता की आवश्यकता है जो किसी अनन्य अनुक्रमणिका अद्यतन या DELETE कार्रवाई के लिए अंतर्निहित तालिका पर मौजूद। किसी दूरस्थ तालिका पर कोई अनन्य अनुक्रमणिका मौजूद नहीं है, तो जब कोई अद्यतन या DELETE का प्रयास किया गया है, तो निम्न त्रुटि होती है:
सर्वर: संदेश 7320, स्तर 16, स्थिति 2, पंक्ति 1 सका नहीं निष्पादित क्वेरी OLE DB प्रदाता 'SQLOLEDB' के विरुद्ध है। प्रदाता एक आवश्यक पंक्ति लुकअप इंटरफ़ेस को समर्थन नहीं कर सका। प्रदाता इंगित करता है कि विरोध अन्य गुण या आवश्यकताओं के साथ हुआ। [OLE/DB प्रदाता संदेश दिया: बहु-चरण OLE DB त्रुटियाँ कार्रवाई पर जनरेट किया गया है। उपलब्ध हो तो हर OLE DB स्थिति मान, जाँच करें। कोई कार्य किया गया था।
यह दोनों के लिए OpenQuery और four-part नाम अद्यतन और DELETE कार्रवाई लागू होता है। दूरस्थ तालिका पर कोई अनन्य अनुक्रमणिका जोड़कर समस्या हल हो गई है।

OpenQuery के साथ डायनेमिक निष्पादन

वह कभी-कभी मानता जैसा निम्न उदाहरण में दिखाया गया है OpenQueryका उपयोग समान प्रभाव प्राप्त करने के लिए एक डायनामिक क्वेरी का उपयोग करने के लिए हो सकता है:
begin tran
SET QUOTED_IDENTIFIER OFF
SET XACT_ABORT ON
declare @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.authors
where au_lname = ''" + @var + "''' )
set au_lname = '" + @var1 + "',
au_fname = '" + @var2 + "'"

exec ( @cmd )

commit tran
select * from <servername>.pubs.dbo.authors