सामग्री की तालिका
- अवलोकन
- कहां खंड
- मल्टीपल टेबल जॉइन
- स्थानीय तालिका दूरस्थ तालिका से जुड़ी हुई है
- सम्मिलित करें, अपडेट करें और हटाएं
- अपडेट करें
- पैरामीटर के साथ अपडेट करें
- नया रिकॉर्ड सम्मिलित करना और BLOB त्रुटि प्राप्त करना
- आपके द्वारा डाले गए अंतिम रिकॉर्ड के लिए Salesforce आईडी प्राप्त करना
- सेल्सफोर्स डेटा में परिवर्तन होने पर SQL सर्वर डेटा अपडेट करना
- आलसी स्कीमा सत्यापन
- ODBC प्रदाता के लिए Microsoft के OLEDB की सीमाएं
- बिलिंग पते में मैं एक लाइन फीड (न्यूलाइन) के साथ रिकॉर्ड कैसे ढूंढूं?
- क्या मैं देख सकता हूँ कि Easysoft सॉफ़्टवेयर के माध्यम से कौन-सी तालिकाएँ उपलब्ध हैं?
- क्या मैं देख सकता हूं कि Easysoft सॉफ़्टवेयर के माध्यम से कौन से कॉलम उपलब्ध हैं?
- क्या मैं प्रोग्रामेटिक रूप से लिंक किया गया सर्वर बना सकता हूं?
अवलोकन
यह दस्तावेज़ Salesforce के साथ SQL सर्वर का उपयोग करने के बारे में कुछ सुझाव देता है। SQL सर्वर को Salesforce से कनेक्ट करने के लिए उपयोग किए जाने वाले घटक SQL सर्वर लिंक्ड सर्वर और Easysoft Salesforce ODBC ड्राइवर हैं। आप SQL सर्वर को Salesforce से कैसे कनेक्ट करते हैं इसका वर्णन इस आलेख में किया गया है। इस दस्तावेज़ के उदाहरणों के लिए, लिंक किए गए सर्वर नाम (जिसे आप अपने SQL कमांड में संदर्भित करते हैं) का उपयोग SF8 है।
इस दस्तावेज़ के सभी SQL का परीक्षण SQL Server 2017 और Easysoft Salesforce ODBC ड्राइवर संस्करण 2.0.0 से 2.0.7 के विरुद्ध किया गया था।
SQL सर्वर कार्य करता है OPENQUERY
और EXEC
(EXECUTE
) SQL सर्वर 2008 में पेश किए गए थे और ये फ़ंक्शन 2008 के बाद SQL सर्वर के सभी संस्करणों के साथ संगत हैं।
हमने यह दस्तावेज़ ईजीसॉफ्ट के माध्यम से सेल्सफोर्स से एसक्यूएल सर्वर को जोड़ने के संबंध में हमारी सहायता टीम द्वारा प्राप्त प्रश्नों की संख्या के जवाब में लिखा है। हालाँकि, SQL उदाहरण लिंक्ड सर्वर कनेक्शन के लिए भी उपयोगी होने चाहिए जो एक भिन्न ODBC ड्राइवर और बैकएंड का उपयोग करते हैं।
यदि आप इस दस्तावेज़ में योगदान देना चाहते हैं, तो कृपया अपना सबमिशन ईमेल करें।
कहां खंड
हमें बताई गई एक सामान्य समस्या है "एक साधारण WHERE क्लॉज केवल एक पंक्ति को वापस करने में लंबा समय लेता है"। उदाहरण के लिए:
SF8.SF.DBO से Id, FirstName, LastName चुनें। संपर्क करें जहाँ Id='00346000002I95MAAS'
SQL सर्वर उपरोक्त क्वेरी को कनवर्ट करता है और इसे Salesforce ODBC ड्राइवर को भेजता है:
SF.DBO.Contact से Id, FirstName, LastName चुनें
WHERE क्लॉज हमेशा हटा दिया जाता है, जो ODBC ड्राइवर को उस टेबल की सभी पंक्तियों को वापस करने के लिए बाध्य करता है। फिर SQL सर्वर आपको आवश्यक पंक्ति (पंक्तियाँ) देने के लिए उन्हें स्थानीय रूप से फ़िल्टर करता है। इससे कोई फर्क नहीं पड़ता कि आपने WHERE क्लॉज क्या निर्दिष्ट किया है, यह कभी भी ODBC ड्राइवर को नहीं दिया जाता है।
इसका सरल समाधान SQL सर्वर OPENQUERY
. का उपयोग करना है इसके बजाय कार्य करें। उदाहरण के लिए:
OPENQUERY से चुनें*
OPENQUERY
. के अंदर आपके द्वारा चलाए गए सभी SQL फ़ंक्शन सीधे ड्राइवर को पास किया जाता है, जिसमेंWHERE
. भी शामिल है खंड।मल्टीपल टेबल जॉइन
यहां एक साधारण दो टेबल जॉइन है जहां दोनों टेबल लिंक किए गए सर्वर से वापस आ रहे हैं।
ए चुनें। 'यूनाइटेड%'SQL सर्वर ODBC ड्राइवर को निम्न क्वेरी भेजता है।
खाते से *चुनें* संपर्क से चुनेंSQL सर्वर कॉलम नामों और डेटा प्रकारों की सूची प्राप्त करने के लिए ऐसा करता है। इसके बाद यह इन प्रश्नों को ODBC ड्राइवर को भेजता है।
"Tbl1001" चुनें। "Col1042" ASCSELECT "Tbl1003" द्वारा ऑर्डर करें।AccountId" "Col1057", "Tbl1003"।" नाम "Col1058" "SF" से। /पूर्व>दोनों प्रश्नों के डेटा को स्थानीय तालिकाओं में वापस कर दिया जाता है, फिर WHERE क्लॉज़ को खाता तालिका पर रखा जाता है और दोनों तालिकाओं के डेटा को जोड़ कर वापस कर दिया जाता है।
फिर से
OPENQUERY
. का उपयोग सुनिश्चित करता है कि आपके द्वारा लिखा गया SQL सीधे ODBC ड्राइवर को पास हो जाता है, इसलिए, इसके बजाय, SQL सर्वर में आप चलाएंगे:OPENQUERY(SF8,'select a.[Name], BillingStreet, c.[Name] से SF.DBO.Account a, SF.DBO.Contact c जहां a.Id=c.AccountID और a. [नाम] जैसे ''यूनाइटेड%''')आपको थोड़े संशोधन की आवश्यकता है, क्योंकि SQL सर्वर एक ही "नाम" के साथ कई स्तंभों को संभाल नहीं सकता है, इसलिए आपको उन स्तंभों में से एक का नाम बदलने की आवश्यकता है। उदाहरण के लिए:
OPENQUERY(SF8,'select a.[Name], BillingStreet, c.[Name] से FullName के रूप में SF.DBO.Account a, SF.DBO.Contact c जहां a.Id=c.AccountID और a.[नाम] जैसे ''यूनाइटेड%''')यह ODBC ड्राइवर को एक ही बार में संपूर्ण SQL को संसाधित करने के लिए बाध्य करता है और केवल आवश्यक परिणाम लौटाता है।
स्थानीय तालिका दूरस्थ तालिका से जुड़ी हुई है
इस उदाहरण में, स्थानीय तालिका को चलाकर बनाया गया था।
SF8.SF.DBO.Account से LocalAccount में * चुनेंदो तालिकाओं का जुड़ाव अब ऐसा दिखता है।
a.[Name], BillingStreet, c.[Name] को LocalAccount a, SF8.SF.DBO.Contact c से पूरा नाम चुनें जहां a.Id=c.AccountID और a.[Name] जैसे 'यूनाइटेड%'इसके कारण SQL सर्वर ODBC ड्राइवर को तीन बार निम्न क्वेरी भेजता है।
संपर्क से *चुनेंउन प्रश्नों में से कम से कम एक में, SQL सर्वर तालिका में सभी डेटा के लिए पूछता है। फिर SQL सर्वर निम्नलिखित के लिए पूछता है:
"Tbl1003" चुनें।SQL सर्वर तब ODBC ड्राइवर को "?" के स्थान पर LocalAccount तालिका से AccountIds की एक सूची भेजता है। पैरामीटर जहां LocalAccount.[Name] कॉलम LIKE क्लॉज से मेल खाता है।
एक तेज़ तरीका जहां ओडीबीसी तालिका क्वेरी में दूसरी तालिका है, केवल ओडीबीसी तालिका से आपको आवश्यक कॉलम प्राप्त करना है। यह
OPENQUERY
. का उपयोग करके किया जा सकता है समारोह। उदाहरण के लिए:ए चुनें। AccountID और a.[Name] जैसे 'यूनाइटेड%'जबकि यह अभी भी संपर्क तालिका से सभी पंक्तियां प्राप्त करता है, यह केवल आवश्यक कॉलम प्राप्त करता है और इसलिए मानक क्वेरी से तेज़ होता है।
एक अन्य संभावित तरीका एक कर्सर और एक अस्थायी तालिका का उपयोग करना होगा। उदाहरण के लिए:
@AccountId को varchar(20) के रूप में घोषित करना शुरू करें @SQL को varchar(1024) के रूप में घोषित करें - खाता जानकारी संग्रहीत करने के लिए एक अस्थायी तालिका बनाएं। आईडी जांच सुनिश्चित करती है कि डेटा की 0 पंक्तियों को वापस लौटाया जाता है, ओपनक्वेरी से #LocalContact में चुनें (SF8, 'चुनें [नाम], SF.DBO से AccountId। संपर्क जहां आईडी =''000000000000000000'' ') - कर्सर घोषित करें सेट करें लोकलअकाउंट से चुनिंदा विशिष्ट आईडी के लिए सेल्कुर कर्सर जहां [नाम] जैसे 'यूनाइटेड%' सेल्कुर से सेलकुर को @AccountId में खोलें, जबकि @@ FETCH_STATUS =0 चुनें @SQL ='#LocalContact में डालें [नाम], ''' चुनें। +@AccountId+''' OPENQUERY(SF8,'' Select [Name] से संपर्क करें जहां AccountId=''''' + @AccountId + ''''''')' exec (@SQL) selcur से आगे प्राप्त करें @AccountId बंद करें selcur डीललोकेट selcur -- इसके बाद, अपनी तालिकाओं में शामिल हों और डेटा देखें a.[Name], BillingStreet, c.[Name] FullName from LocalAccount a, #LocalContact c जहां a.Id=c.AccountID और a.[Name] जैसे 'यूनाइटेड%' -- अस्थायी टैब को हटाना न भूलें ले ड्रॉप टेबल #LocalContact Endयह विधि
OPENQUERY
. से कई गुना तेज हो सकती है पिछले उदाहरण में दिखाया गया तरीका, यदि Easysoft ODBC ड्राइवर को WHERE क्लॉज पास किया जा रहा है, तो Salesforce में एक इंडेक्स का उपयोग करता है।सम्मिलित करें, अपडेट करें और हटाएं
यदि आप कोई ऐसी क्वेरी चला रहे हैं जो SELECT क्वेरी नहीं है तो ऐसा करने का सबसे अच्छा तरीका SQL सर्वर
EXEC
का उपयोग करना है। समारोह। यदि आपका लिंक किया गया सर्वरEXEC
का उपयोग नहीं कर सकता है , आपको इसके समान एक संदेश प्राप्त होगा:सर्वर 'SF8' RPC के लिए कॉन्फ़िगर नहीं किया गया है।
EXEC
का उपयोग करने के लिए , अपने लिंक किए गए सर्वर पर राइट-क्लिक करें और गुण चुनें। "सर्वर विकल्प" अनुभाग में, "RPC आउट" को "True" पर सेट करें। फिर आपEXEC
. का उपयोग कर सकते हैं समारोह।अपडेट करें
मान लें कि आपके पास यह कथन SQL सर्वर में है:
अद्यतन SF8.SF.DBO.संपर्क SET LastName='James' WHERE Id='00346000002I95MAAS'SQL सर्वर इस SQL को ODBC ड्राइवर को भेजता है।
"SF"।"DBO"।"Contact". से * चुनेंसभी रिकॉर्ड पुनः प्राप्त किए जाते हैं और SQL सर्वर तब यह कथन ODBC ड्राइवर को भेजता है।
अपडेट "एसएफ"।"डीबीओ"।"संपर्क करें"सेट"अंतिम नाम"=? जहां "आईडी" =? और "अंतिम नाम"=?SQL सर्वर यह सुनिश्चित करने के लिए कर रहा है कि आपके द्वारा क्वेरी चलाने के समय और अद्यतन निष्पादित होने के समय के बीच रिकॉर्ड परिवर्तित नहीं होता है। SQL सर्वर
EXEC
का उपयोग करने का एक तेज़ तरीका है समारोह। उदाहरण के लिए:exec ('अपडेट SF.DBO.Contact set LastName=''James'' जहां Id=''00346000002I95MAAS''' ) SF8 परSQL सर्वर ODBC ड्राइवर को आपके द्वारा दर्ज की गई संपूर्ण स्ट्रिंग भेजता है, इसलिए क्वेरी को संपूर्ण तालिका का चयन किए बिना निष्पादित किया जाता है।
पैरामीटर के साथ अपडेट करें
मान लें कि आपके पास है:
आरंभ करें @Id varchar(20)='00346000002I95MAAS' घोषणा @LastName varchar(20)='James' update SF8.SF.DBO.Contact set LastName=@LastName जहां Id=@IdEndयह ठीक उसी तरह काम करता है जैसा कि अपडेट नोट्स में वर्णित है। हालांकि,
EXEC
. का उपयोग करते समय सिंटैक्स कार्य परिवर्तन:आरंभ करें @Id varchar(20)='00346000002I95MAAS' घोषणा @LastName varchar(20)='James' exec ('अपडेट SF.DBO.Contact set LastName=? where Id=?', @LastName, @Id ) SF8End परजहां आपके पास
LastName=
. जैसा कॉलम है आपने?
put डाला है@LastName
. के स्थान पर यह दर्शाने के लिए कि आप पैरामीटर में क्या पारित करने जा रहे हैं। पैरामीटर को अद्यतन विवरण के बाद उस क्रम में सूचीबद्ध किया जाता है जिसमें उन्हें पढ़ने की आवश्यकता होती है।नया रिकॉर्ड सम्मिलित करना और BLOB त्रुटि प्राप्त करना
मान लें कि आप दौड़ने की कोशिश कर रहे हैं:
SF8.SF.DBO.Contact ( FirstName, LastName ) मान ('Easysoft','Test') में डालेंSQL सर्वर इसे ODBC ड्राइवर को भेजता है:
"SF"।"DBO"।"Contact". से * चुनेंयह दो बार किया जाता है। यह पहली बार चलाया जाता है, SQL सर्वर यह देखने के लिए जाँच कर रहा है कि क्या परिणाम सेट अद्यतन करने योग्य है। यह दूसरी बार भेजा जाता है, अंतिम रिकॉर्ड वापस आने के बाद SQL सर्वर एक खाली रिकॉर्ड में चला जाता है और एक स्थितिगत INSERT करने का प्रयास करता है, जो एक त्रुटि देता है।
लिंक किए गए सर्वर के लिए OLE DB प्रदाता "MSDASQL" "SF8" ने संदेश दिया "क्वेरी-आधारित सम्मिलन या BLOB मानों का अद्यतन समर्थित नहीं है।"।यह संदेश लौटाया जाता है क्योंकि एक पोजिशनल इंसर्ट आपके द्वारा अपने INSERT स्टेटमेंट में निर्दिष्ट किए गए को छोड़कर NULL मानों के साथ सभी कॉलम सम्मिलित करने का प्रयास करता है, और संपर्क तालिका के मामले में, एक BLOB (सेल्सफोर्स में लॉन्ग टेक्स्ट एरिया) होता है। जिसका Microsoft का OLE DB प्रदाता समर्थन नहीं करता है। Easysoft Salesforce ODBC ड्राइवर Salesforce के भीतर उन सभी फ़ील्ड को सम्मिलित करने का समर्थन करता है जहाँ आपको डेटा सम्मिलित करने की अनुमति है। इससे निजात पाने के लिए, आपको केवल EXEC का उपयोग करना होगा।
SF8 परexec ('SF.DBO.Contact ( FirstName, LastName ) मान (''Easysoft'',''Test'')') में डालेंयह सिर्फ INSERT को सीधे ODBC ड्राइवर के पास भेजता है।
आपके द्वारा डाले गए अंतिम रिकॉर्ड के लिए Salesforce आईडी प्राप्त करना
हमारे कुछ ग्राहकों ने हमसे पूछा है कि अभी डाली गई पंक्ति की आईडी प्राप्त करने का सबसे आसान तरीका क्या है। यह उदाहरण दिखाता है कि आप "संपर्क" तालिका में डाले गए अंतिम रिकॉर्ड की आईडी कैसे प्राप्त कर सकते हैं।
आरंभ करें @Id varchar(20)='00346000002I95MAAS' घोषणा @FirstName varchar(20)='Easysoft' घोषणा @LastName varchar(20)='Test' घोषणा @FindTS varchar(22)=convert(varchar(22) ),GETUTCDATE(),120) SF8 पर @SQL को varchar(1024) exec ('SF.DBO.Contact (FirstName, LastName) मान (?,?)', @FirstName, @LastName ) के रूप में घोषित करें @SQL चुनें ='ओपनक्वेरी से आईडी का चयन करें(SF8, ''शीर्ष 1 c.Id का चयन करें [उपयोगकर्ता] u से, संपर्क c जहां u.Username=CURRENT_USER और c.CreatedDate>={ts '''''+@FindTS+''' ''} और c.CreatedById=u.Id क्रम c.CreatedDate desc'')' exec (@SQL) Endजब सेल्सफोर्स में एक रिकॉर्ड बनाया जाता है, तो "क्रिएटेडडेट" कॉलम में एक टाइमस्टैम्प होता है जो कि यूटीसी (कोऑर्डिनेटेड यूनिवर्सल टाइम) रिकॉर्ड बनाया गया था और जरूरी नहीं कि आपकी वर्तमान तिथि/समय हो।
@FindTs
INSERT होने से पहले स्ट्रिंग को UTC पर सेट किया जाता है, इसलिए जब Id प्राप्त करने के लिए SELECT को कॉल किया जाता है, तो यह केवल@FindTS
के बाद डाली गई पंक्तियों को देख रहा होता है। सेट किया गया था।चयन के दौरान, Easysoft
CURRENT_USER
फ़ंक्शन का उपयोग Salesforce से लौटाई गई पंक्तियों को केवल उस उपयोगकर्ता तक सीमित करने के लिए किया जाता है जिसने डेटा डाला है।सेल्सफोर्स डेटा में परिवर्तन होने पर SQL सर्वर डेटा अपडेट करना
यह खंड आपको दिखाता है कि Salesforce तालिका की संरचना के आधार पर एक नई SQL सर्वर तालिका कैसे बनाई जाए और उस तालिका में परिवर्तन होने पर उस तालिका को अपडेट करें।
प्रक्रिया बनाएं SFMakeLocal(@Link varchar(50), @Remote varchar(50), @Local varchar(50), @DropLocal int) @SQL को nvarchar(max) start /* के रूप में घोषित करें एक स्थानीय में डेटा आयात करता है तालिका */ /* स्थानीय तालिका को छोड़ने के लिए ड्रॉपलोकल को 1 पर सेट करें यदि यह मौजूद है */ यदि OBJECT_ID(@Local, 'U') IS NOT NULL start if (@DropLocal=1) start set @SQL='DROP TABLE dbo. '+@लोकल एक्ज़ीक्यूटिव (@एसक्यूएल) एंड एंड रेज़रर(15600,1,1, 'लोकल टेबल पहले से मौजूद है') रिटर्न एंड सेट @एसक्यूएल='सेलेक्ट * इन डीबीओ।'+@लोकल+' फ्रॉम OPENQUERY('+@Link+ ','''+@Remote+''' से * चुनें)' exec(@SQL) 'लोकल टेबल :'+@Local+' बनाया गया चुनें। अंत -- @ अपने SQL सर्वर से लिंक किए गए सर्वर को लिंक करें -- @Remote Salesforce के भीतर तालिका का नाम -- @Local वह स्थानीय तालिका जिसमें आप डेटा संग्रहीत करना चाहते हैं -- @DropLocal यदि तालिका मौजूद है और आप चाहते हैं तो 1 पर सेट करें इसे छोड़ने के लिएSalesforce तालिका से रिकॉर्ड संरचना को स्थानीय तालिका में कॉपी करने के लिए प्रक्रिया चलाएँ और फिर सभी Salesforce डेटा को स्थानांतरित करें। यह उदाहरण आदेश खाता तालिका का उपयोग करता है। Salesforce तालिका में आपके पास मौजूद डेटा की मात्रा के आधार पर इस प्रक्रिया में काफी समय लग सकता है।
SFMakeLocal 'SF8','Account','LocalAccount', 0तर्क हैं:
तर्क | मान |
---|---|
SF8 | SQL सर्वर लिंक्ड सर्वर नाम। |
खाता | सेल्सफोर्स टेबल नाम जिसे आप संरचना और डेटा को पढ़ने के लिए उपयोग करना चाहते हैं। |
स्थानीय खाता | SQL सर्वर में आपकी तालिका का नाम। |
0 | यदि आप Salesforce में अधिक कस्टम कॉलम जोड़ते हैं और नए कॉलम के साथ इसे फिर से बनाने के लिए स्थानीय तालिका को छोड़ना चाहते हैं तो यह डिफ़ॉल्ट मान 1 में बदला जा सकता है। |
अगला कदम दो और प्रक्रियाओं को बनाना है जो किसी भी डेटा को अपडेट करने या सेल्सफोर्स टेबल में डालने पर स्थानीय टेबल को अपडेट कर देंगी:
प्रक्रिया बनाएं SFUpdateTable ( @Link varchar(50), @Remote varchar(50), प्रक्रिया बनाएं SFUpdateTable @Link varchar(50), @Remote varchar(50), @LocalTable varchar(50) जैसा कि शुरू होता है - अपडेट करता है Salesforce में परिवर्तन के आधार पर स्थानीय तालिका में डेटा। @TempDef को varchar (50) ='## EasyTMP_' के रूप में घोषित करें @TempName को varchar (50) घोषित करें @TempNumber को दशमलव के रूप में घोषित करें @CTS को datetime =current_timestamp घोषित करें @TTLimit int =100 घोषित @MaxCreated as datetime घोषित @MaxModified as datetime घोषित @SQL nvarchar(max) घोषित @RC int - पहला कदम एक वैश्विक अस्थायी तालिका बनाना है। @TempNumber=datepart(yyyy,@CTS)*10000000000 सेट करें + datepart(mm,@CTS)*100000000+datepart(dd,@CTS)*1000000+datepart(hh,@CTS)*10000+datepart(mi,@CTS)*100+datepart(ss,@CTS) set @ TempName=@TempDef+cast(@TempNumber as varchar(14)) जबकि OBJECT_ID(@TempName, 'U') IS NOT NULL start RAISERROR (15600,1,1, 'Temp name पहले से ही प्रयोग में है।') RETURN एंड सेट @SQL='select * in'+@TempName+' from '+@ लोकलटेबल+' जहां 1=0' टेबल बनाएं #LocalDates ( ColName varchar(20), DTS datetime) set @sql='insert in #LocalDates Select'' Created', max(CreatedDate) from '+@LocalTable exec (@sql) ) सेट @ sql ='#LocalDates में डालें' 'संशोधित' चुनें, अधिकतम (LastModifiedDate) '+@LocalTable exec (@sql) से @MaxCreated=DTS को #LocalDates से चुनें जहां ColName='बनाया गया' @MaxModified=DTS चुनें #LocalDates से जहां ColName='संशोधित' ड्रॉप टेबल #LocalDates ने @SQL='select* को '+@TempName+' में openquery('+@Link+',''Select * from'+@Remote+' जहां CreatedDate>{ts '''''+ कन्वर्ट (वर्कर(22),@MaxCreated,120)+''''}'')' exec(@SQL) exec SFAppe ndFromTemp @LocalTable, @TempName @SQL='ड्रॉप टेबल'+@TempName exec (@SQL) सेट करें +@Remote+' जहां LastModifiedDate>{ts'''''+convert(varchar(22),@MaxModified,120)+'''''} and CreatedDate<={ts'''''+convert(varchar( 22),@MaxCreated,120)+''''}'')' exec (@SQL) exec SFAppendFromTemp @LocalTable, @TempName सेट @SQL='ड्रॉप टेबल'+@TempName exec (@SQL) एंड क्रिएट प्रक्रिया SFAppendFromTemp(@Local varchar(50), @TempName varchar(50)) start /* के रूप में स्थानीय तालिका में डेटा आयात करने के लिए अस्थायी तालिका का उपयोग करता है यह सुनिश्चित करता है कि किसी भी डुप्लिकेट को पहले हटा दिया गया है */ @Columns nvarchar(max) घोषित करें @ ColName varchar(50) @SQL nvarchar(max) set @sql='delete from '+@Local+' घोषित करें जहाँ Id ('+@TempName+' से Id चुनें)' exec (@SQL) sysobjects.id =syscolumns.id पर syscolumns इनर जॉइन syscolumns से चुनिंदा syscolumns.name के लिए @Columns='' घोषित col_cursor कर्सर सेट करें जहां sysobjects.xtype ='u' और sysobjects.name =@Local open col_cursor col_cursor से @ ColName जबकि @@FETCH_STATUS=0 प्रारंभ सेट @Columns=@Columns+'['+@ColName+']' col_cursor से @ColName में प्राप्त करें यदि (@@FETCH_STATUS=0) @Columns=@Columns+', ' End Close col_cursor col_cursor सेट @sql='insert in'+@Local+' ('+@Columns+') से '+@Columns+' को '+@TempName exec (@sql) अंत में सेट करें -- डेटा प्राप्त करने के लिए दो प्रक्रियाओं का उपयोग किया जाता है a रिमोट टेबल। 1) SFUpdateTable, जो - डेटा को एक अस्थायी तालिका में कॉपी करता है। 2) SFAppendFromTemp, जो जोड़ता है - अस्थायी तालिका से डेटा स्थानीय तालिका में। -- @ अपने SQL सर्वर से लिंक किए गए सर्वर नाम को लिंक करें -- @Remote Salesforce के भीतर तालिका का नाम -- @Local वह स्थानीय तालिका जहां आप डेटा को संग्रहीत करना चाहते हैं -- @TempName उस तालिका का नाम जिसका उपयोग किया जा सकता है डेटा को अस्थायी रूप से स्टोर करने के लिए। न करें -- एक वास्तविक अस्थायी तालिका नाम का उपयोग करें जैसे #temp, यह काम नहीं करेगा।
इसका परीक्षण करने के लिए, दौड़ें:
SFUpdateTable 'SF8','Account','LocalAccount'
इस उदाहरण का उपयोग किसी भी Salesforce तालिका के साथ किया जा सकता है, जिस पर उपयोगकर्ता की पहुंच हो।
आलसी स्कीमा सत्यापन
आपके SQL सर्वर लिंक्ड सर्वर गुणों में, "सर्वर विकल्प" अनुभाग के अंतर्गत, "आलसी स्कीमा सत्यापन" के लिए एक विकल्प है। डिफ़ॉल्ट रूप से, यह FALSE पर सेट होता है, जिसके कारण SQL सर्वर दो बार SELECT स्टेटमेंट भेजता है। पहली बार क्वेरी भेजे जाने पर, SQL सर्वर आपके परिणाम सेट के बारे में मेटाडेटा बनाने के लिए वापस पास किए गए विवरण का उपयोग करता है। फिर क्वेरी फिर से भेजी जाती है। यह काफी महंगा ओवरहेड है, इसलिए Easysoft अनुशंसा करेगा कि आप "Lazy Schema Validation" को TRUE पर सेट करें, जिसका अर्थ है कि केवल एक क्वेरी भेजी जाती है, मेटाडेटा और परिणाम सेट दोनों को एक बार में पुनर्प्राप्त करना। इससे Salesforce API कॉल की संख्या में भी बचत होती है।
ओडीबीसी प्रदाता के लिए माइक्रोसॉफ्ट के OLEDB की सीमाएं
ODBC प्रदाता के लिए OLEDB की सीमाओं के बारे में विवरण यहां पाया जा सकता है:
https://msdn.microsoft.com/en-us/library/ms719628(v=vs.85).aspx
मैं बिलिंग पते में लाइन फ़ीड (न्यूलाइन) के साथ रिकॉर्ड कैसे ढूंढूं?
Easysoft ड्राइवर के कुछ आंतरिक कार्यों का उपयोग करके, आप आसानी से रिकॉर्ड ढूंढ सकते हैं जहां बिलिंग पते में रिकॉर्ड के भीतर एक लाइन फीड है। उदाहरण के लिए:
select * from openquery(sf8,'select Id, Name, {fn POSITION({fn CHAR(10)} IN BillingStreet)} LinePos from Account where {fn POSITION({fn CHAR(10)} IN BillingStreet)} >0')
POSITION(x)
यह फ़ंक्शन x
. की स्थिति की तलाश करता है निर्दिष्ट कॉलम के भीतर।
CHAR(X)
यह फ़ंक्शन x
. के ASCII मान के साथ वर्ण लौटाता है ।
हमारे Salesforce ODBC ड्राइवर में उपलब्ध कार्यों के बारे में अधिक जानकारी यहाँ पाई जा सकती है
क्या मैं देख सकता हूं कि Easysoft सॉफ़्टवेयर के माध्यम से कौन-सी तालिकाएं उपलब्ध हैं?
उन तालिकाओं की सूची प्राप्त करने के लिए जिन्हें आप एक्सेस कर सकते हैं, दौड़ें:
select * from openquery(SF8,'select TABLE_NAME from INFO_SCHEMA.TABLES')
क्या मैं देख सकता हूं कि Easysoft सॉफ़्टवेयर के माध्यम से कौन से कॉलम उपलब्ध हैं?
आप चलकर तालिका में मौजूद स्तंभों की सूची प्राप्त कर सकते हैं:
openquery से * चुनें (SF8, INFO_SCHEMA.COLUMNS से * चुनें जहां TABLE_NAME=''Account'' ')
इस पद्धति का उपयोग करके आप केवल उन स्तंभों की सूची प्राप्त कर सकते हैं जो आपके द्वारा TABLE_NAME WHERE खंड में निर्दिष्ट तालिका से संबंधित हैं। यदि आप सभी तालिकाओं के लिए स्तंभों की पूरी सूची देखना चाहते हैं, तो दौड़ें:
घोषणा शुरू करें @Table nvarchar(max) openquery से TABLE_NAME के लिए टेबल_कर्सर कर्सर घोषित करें (SF8, 'INFO_SCHEMA.TABLES से TABLE_NAME का चयन करें') open table_cursor को table_cursor से @Table में लाएं जबकि @@FETCH_STATUS=0 निष्पादन शुरू करें (' INFO_SCHEMA.COLUMNS से चुनें * जहां TABLE_NAME=?', @Table) SF8 पर table_cursor से आगे @Table अंत में लाएं table_cursor delocate table_cursorend
क्या मैं प्रोग्रामेटिक रूप से एक लिंक्ड सर्वर बना सकता हूं?
हां। वेब पर इसके बहुत सारे उदाहरण हैं, उदाहरण के लिए:
http://www.sqlservercentral.com/articles/Linked+Servers/142270/?utm_source=SSC