Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

Salesforce SOQL के साथ SQL सर्वर का उपयोग करने के लिए युक्तियाँ

सामग्री की तालिका

  1. अवलोकन
  2. एसक्यूएल सर्वर में सरल चयन क्वेरी काम नहीं करती हैं
  3. SOQL ड्राइवर का उपयोग करके बल्क इंसर्टिंग डेटा
  4. अपडेट करें और क्वेरी बल्किंग हटाएं
  5. ईज़ीसॉफ्ट ट्रांजेक्शनल सपोर्ट
  6. आलसी स्कीमा सत्यापन
  7. ODBC प्रदाता के लिए Microsoft के OLEDB की सीमाएं

अवलोकन

यह दस्तावेज़ Salesforce के साथ SQL सर्वर का उपयोग करने के बारे में कुछ सुझाव देता है। SQL सर्वर को Salesforce से कनेक्ट करने के लिए उपयोग किए जाने वाले घटक SQL सर्वर लिंक्ड सर्वर और Easysoft Salesforce ODBC ड्राइवर हैं। आप SQL सर्वर को Salesforce से कैसे कनेक्ट करते हैं इसका वर्णन इस आलेख में किया गया है। इस दस्तावेज़ के उदाहरणों के लिए, लिंक किए गए सर्वर नाम (जिसे आप अपने SQL कमांड में संदर्भित करते हैं) का उपयोग SFSOQL8 है।

इस दस्तावेज़ के सभी SQL का परीक्षण SQL Server 2017 और Easysoft Salesforce ODBC ड्राइवर संस्करण 2.0.0 के विरुद्ध किया गया था।

यदि आप इस दस्तावेज़ में योगदान देना चाहते हैं, तो कृपया अपना सबमिशन ईमेल करें।

SQL सर्वर में साधारण चयन क्वेरी काम नहीं करती हैं

मान लें कि आप इस क्वेरी को SQL सर्वर में चलाने का प्रयास कर रहे हैं:

SELECT Id FROM SFSOQL8...Account

SQL सर्वर उस SQL ​​​​को इसमें कनवर्ट करता है:

SELECT "Tbl1002"."Id" "Col1004" FROM "Account" "Tbl1002"

चूंकि Salesforce SOQL भाषा उस तरह से तालिकाओं और स्तंभों के नाम बदलने का समर्थन नहीं करती है, आप इस त्रुटि के साथ समाप्त होते हैं:

OLE DB provider "MSDASQL" for linked server "SFSOQL8" returned message "[Easysoft][Salesforce SOQL ODBC Driver]General error: Query Failed: 'MALFORMED_QUERY: only aggregate expressions use field aliasing'". Msg 7320, Level 16, State 2, Line 1 Cannot execute the query "SELECT "Tbl1002"."Id" "Col1004" FROM "Account" "Tbl1002"" against OLE DB provider "MSDASQL" for linked server "SFSOQL8".

SQL सर्वर में Easysoft ड्राइवर को SOQL भेजने के लिए दो तरीके उपलब्ध हैं:

  1. OPENQUERY , जिसका उपयोग दूरस्थ और स्थानीय डेटा में शामिल होने के लिए स्थानीय तालिकाओं के संयोजन में किया जा सकता है।
  2. EXEC जिसका उपयोग पैरामीटर के साथ सेल्सफोर्स के विरुद्ध सीधे आपके SOQL को चलाने के लिए किया जा सकता है।

इन विधियों को प्रदर्शित करने के लिए, हम SOQL टेबल जॉइन के साथ शुरुआत करेंगे:

SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity

SQL सर्वर में, आप निम्न में से कोई भी क्वेरी चला सकते हैं:

SELECT * FROM OPENQUERY(SFSOQL8, 'SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity')

—या—

SFSOQL8 पर
EXEC ('SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity') at SFSOQL8

प्रदर्शन में लगभग कोई अंतर नहीं है क्योंकि आपके द्वारा लिखा गया SOQL सीधे Salesforce सर्वर को भेज दिया जाता है।

इसी तरह, सभी SOQL फ़ंक्शन भी समान विधियों का उपयोग करके उपलब्ध हैं:

SELECT * FROM OPENQUERY(SFSOQL8, 'select Id, Name, DISTANCE(CustLocation__c , GEOLOCATION(37.775,-122.418), ''mi'') from Account where Name like ''Bur%'' ')
SELECT * FROM OPENQUERY(SFSOQL8, 'SELECT Type, BillingCountry, GROUPING(Type) grpType, GROUPING(BillingCountry) grpCty, COUNT(id) accts FROM Account GROUP BY CUBE(Type, BillingCountry) ORDER BY GROUPING(Type), GROUPING(BillingCountry)')

यदि आप अमान्य SOQL में पास करते हैं, तो Easysoft SOQL ड्राइवर सीधे Salesforce से त्रुटि लौटाएगा। उदाहरण के लिए:

SELECT * FROM OPENQUERY(SFSOQL8, 'select Id, Name, DISTANCE(CustLocation__c , GEOLOCATION(37.775,-122.418), ''mo'') from Account where Name like ''Bur%'' ')
OLE DB provider "MSDASQL" for linked server "SFSOQL8" returned message "[Easysoft][Salesforce SOQL ODBC Driver]General error: Query Failed: 'INVALID_FIELD: 
select Id, Name, DISTANCE(CustLocation__c , GEOLOCATION(37.775
                          ^
ERROR at Row:1:Column:27
Invalid distance unit: mo. Valid unit: 'mi', 'km''".
Msg 7320, Level 16, State 2, Line 1
Cannot execute the query "select Id, Name, DISTANCE(CustLocation__c , GEOLOCATION(37.775,-122.418), 'mo') from Account where Name like 'Bur%' " against OLE DB provider "MSDASQL" for linked server "SFSOQL8". 

SOQL भाषा के बारे में अधिक जानकारी यहाँ पाई जा सकती है।

SOQL ड्राइवर का उपयोग करके बल्क इंसर्टिंग डेटा

Salesforce SOAP API में एक फ़ंक्शन है जो आपको एक SOAP API कॉल से डेटा की अधिकतम 200 पंक्तियाँ सम्मिलित करने की अनुमति देता है। Easysoft Salesforce SOQL ODBC ड्राइवर इस फ़ंक्शन का उपयोग करता है और आपको एक बार में 200 पंक्तियों तक बल्क लोड करने के लिए SQL सर्वर TSQL का उपयोग करने देता है।

मेरे उदाहरण में, मैं Salesforce के भीतर खाता ऑब्जेक्ट में नए रिकॉर्ड जोड़ने जा रहा हूं। यह डेटा के केवल कुछ कॉलम के साथ एक बहुत ही बुनियादी उदाहरण है, लेकिन मुझे आशा है कि यह बताता है कि SQL सर्वर से बल्क इंसर्ट कैसे संभव है। SQL सर्वर में, मेरे पास खाता नामक एक स्थानीय तालिका है जो इस तरह दिखती है:

begin
    declare @BlockCount as int
    declare @IsPosted as int
    declare @PrmName As nvarchar(255)
    declare @PrmAddress As nvarchar(255)
    declare @PrmTown As nvarchar(40)
    declare @PrmPostCode As nvarchar(30)
    declare @PrmDescription As nvarchar(255)
	declare @SQL as nvarchar(255)

	set @BlockCount=0
	set @SQL='insert into Account (Name, BillingStreet, BillingCity, BillingPostalCode, Description ) values ( ?, ?, ?, ?, ? )'

	declare select_cursor cursor local FORWARD_ONLY for 
		select AccName, "Property Description", "Address", Town, PostCode from Account Order by Id

	open select_cursor
	fetch next from select_cursor into @PrmName, @PrmAddress, @PrmTown, @PrmPostCode, @PrmDescription
	while @@FETCH_STATUS=0
	begin
		if (@BlockCount=0)
		Begin
			set @IsPosted=0
			exec('Begin Trans') at SFSOQL8
		end
		set @BlockCount=@BlockCount+1

		exec (@SQL, @PrmName, @PrmAddress, @PrmTown, @PrmPostCode, @PrmDescription) at SFSOQL8

		if (@BlockCount=200)
		Begin
			set @IsPosted=1
			exec('Commit') at SFSOQL8
		end
		fetch next from select_cursor into @PrmName, @PrmAddress, @PrmTown, @PrmPostCode, @PrmDescription

	end

	if (@IsPosted=0)
	begin
		exec('Commit') at SFSOQL8
	end
	
	close select_cursor;
	deallocate select_cursor;
end
. को हटा दें

यह TSQL मेरी स्थानीय खाता तालिका को कर्सर में पढ़कर काम करता है।

200 पंक्तियों के पहले ब्लॉक की शुरुआत में, Begin Trans कहा जाता है, जो Easysoft ड्राइवर को बताता है कि उसे दिया गया कोई भी डेटा Commit तक रखा जाएगा या एक Rollback कहा जाता है।

EXEC फ़ंक्शन कर्सर में मिली प्रत्येक पंक्ति को Easysoft ड्राइवर को भेजता है। ड्राइवर तब आवश्यक SOAP API कॉल बनाता है। जब ईज़ीसॉफ्ट को 200 पंक्तियाँ भेजी जाती हैं, तो मैं एक Commit भेजता हूँ , जिसके कारण ड्राइवर सेल्सफोर्स को SOAP API कॉल भेजता है।

जब कर्सर का अंत हो जाता है, अगर Easysoft ड्राइवर को कोई रिकॉर्ड भेजा गया है जो Salesforce को पास नहीं किया गया है, तो मैं एक अंतिम Commit भेजता हूं . फिर कर्सर को बंद कर दिया जाता है और हटा दिया जाता है।

200 पंक्ति की सीमा Salesforce के भीतर एक आंतरिक सीमा है। यदि आप 200 से अधिक पंक्तियाँ भेजने का प्रयास करते हैं तो आपको Salesforce त्रुटि प्राप्त होगी। Easysoft ड्राइवर की कोई अंतर्निहित सीमा नहीं है, इसलिए यदि Salesforce SOAP API के भविष्य के संस्करणों में 200 पंक्ति की सीमा बढ़ाता है, तो Easysoft ड्राइवर स्वचालित रूप से नई सीमा के साथ काम करेगा।

इस बल्क इंसर्ट विधि का उपयोग करते समय आप एक ही ब्लॉक में डेटा डालने के लिए तालिकाओं की संख्या की कोई सीमा नहीं रखते हैं, इसलिए निम्न TSQL काम करेगा:

SFSOQL8 पर
Begin
	exec('Begin Trans') at SFSOQL8
	exec('Insert into Account ( Name ) values (''Richard Test'') ') at SFSOQL8
	exec('Insert into Opportunity ( Name, StageName, CloseDate ) values (''Richard Test'', ''My Stage'', ''2018-08-14T10:07:00Z'') ') at SFSOQL8
	exec('Commit') at SFSOQL8
End

इंसर्ट के लिए बिगिन ट्रांस / कमिट मेथड का उपयोग करते समय आप केवल इंसर्ट स्टेटमेंट भेज सकते हैं। आप इंसर्ट और अपडेट को मिक्स एंड मैच नहीं कर सकते क्योंकि यह Salesforce SOAP API में समर्थित नहीं है।

अपडेट करें और क्वेरी बल्किंग हटाएं

UPDATE या DELETE क्वेरी के साथ उपयोग किए जाने पर, हमारे SOQL ड्राइवर के पास डेटा लेनदेन को बल्क करने के लिए एक अंतर्निहित विधि है।

यह उदाहरण दिखाता है कि मैं एक कस्टम कॉलम को एक सेट मान में कैसे अपडेट करता हूं।

SFSOQL8 पर
EXEC ('UPDATE Account SET CustomerPriority__c=''low'' WHERE CustomerPriority__c=NULL') at SFSOQL8

सेल्सफोर्स SOQL का उपयोग करके UPDATEs या DELETEs का समर्थन नहीं करता है, इसलिए Easysoft ड्राइवर को क्वेरी को SOQL SELECT में बदलना होगा। SELECT से लौटाई गई पंक्तियों को फिर 200 तक के ब्लॉक में बड़ा किया जाता है और एक बार में UPDATE या DELETE के लिए एक ब्लॉक भेजा जाता है।

Easysoft Transactional Support

Easysoft Salesforce SOQL ODBC ड्राइवर केवल एकल स्तर के लेन-देन का समर्थन करता है। तो एक Begin Trans इसके बाद कुछ INSERT को COMMIT . के साथ Salesforce को भेजा जा सकता है या एक Rollback . का उपयोग करके ड्राइवर के भीतर फेंक दिया जाता है ।

आलसी स्कीमा सत्यापन

"सर्वर विकल्प" अनुभाग के अंतर्गत आपके SQL सर्वर लिंक्ड सर्वर गुणों में "आलसी स्कीमा सत्यापन" के लिए एक विकल्प है। डिफ़ॉल्ट रूप से, यह FALSE पर सेट होता है जो SQL सर्वर को दो बार स्टेटमेंट भेजने के लिए SELECT स्टेटमेंट चलाने का कारण बनता है। इसे पहली बार भेजे जाने पर SQL सर्वर आपके परिणाम सेट के बारे में मेटा डेटा बनाने के लिए वापस पास किए गए विवरण का उपयोग करता है। फिर क्वेरी फिर से भेजी जाती है। यह काफी महंगा ओवरहेड है, इसलिए Easysoft अनुशंसा करेगा कि आप "Lazy Schema Validation" को TRUE पर सेट करें, जिसका अर्थ है कि केवल एक SELECT भेजा जाता है, जो मेटा डेटा और डेटा दोनों प्राप्त करता है। इससे Salesforce API कॉल की संख्या भी कम हो जाती है।

ओडीबीसी प्रदाता के लिए माइक्रोसॉफ्ट के OLEDB की सीमाएं

ODBC प्रदाता के लिए OLEDB की सीमाओं के बारे में विवरण यहां पाया जा सकता है:

https://msdn.microsoft.com/en-us/library/ms719628(v=vs.85).aspx


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर स्ट्रिंग को डेटाटाइम में कनवर्ट करता है

  2. SQL सर्वर के लिए I/O प्रदर्शन का विश्लेषण

  3. विस्टाडीबी के क्या फायदे हैं

  4. आप उसी सर्वर पर प्रतिलिपि के रूप में डेटाबेस का बैकअप और पुनर्स्थापना कैसे करते हैं?

  5. जहां न्यूल है, नॉट न्यूल या नो व्हेयर क्लॉज SQL सर्वर पैरामीटर मान पर निर्भर करता है