Inhoudsopgave
- Overzicht
- Eenvoudige selectiequery's in SQL Server werken niet
- Gegevens in bulk invoegen met het SOQL-stuurprogramma
- Update en verwijder query bulking
- Transactieondersteuning van Easysoft
- Luie schemavalidatie
- Beperkingen van de OLEDB voor ODBC-provider van Microsoft
Overzicht
Dit document geeft enkele tips voor het gebruik van SQL Server met Salesforce. De componenten die worden gebruikt om SQL Server met Salesforce te verbinden, zijn een SQL Server Linked Server en het Easysoft Salesforce ODBC-stuurprogramma. In dit artikel wordt beschreven hoe u SQL Server verbindt met Salesforce. Voor de voorbeelden in dit document is de naam van de gekoppelde server (waarnaar u verwijst in uw SQL-opdrachten) SFSOQL8.
Alle SQL in dit document is getest tegen SQL Server 2017 en het Easysoft Salesforce ODBC-stuurprogramma versie 2.0.0.
Als u wilt bijdragen aan dit document, kunt u uw inzending e-mailen naar .
Eenvoudige selectiequery's in SQL Server werken niet
Stel dat u deze query probeert uit te voeren in SQL Server:
SELECT Id FROM SFSOQL8...Account
SQL Server zet die SQL om in:
SELECT "Tbl1002"."Id" "Col1004" FROM "Account" "Tbl1002"
Omdat de Salesforce SOQL-taal het op die manier hernoemen van tabellen en kolommen niet ondersteunt, krijg je deze fout:
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 Server heeft twee methoden beschikbaar voor het verzenden van SOQL naar de Easysoft-driver:
OPENQUERY
, die kan worden gebruikt in combinatie met lokale tabellen om externe en lokale gegevens samen te voegen.EXEC
die samen met parameters kan worden gebruikt om uw SOQL rechtstreeks tegen Salesforce uit te voeren.
Om deze methoden te demonstreren, beginnen we met een SOQL-tabel-join:
SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity
In SQL Server kunt u een van de volgende query's uitvoeren:
SELECT * FROM OPENQUERY(SFSOQL8, 'SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity')
—Of—
EXEC ('SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity') at SFSOQL8
Er is bijna geen verschil in prestatie, aangezien de SOQL die u hebt geschreven rechtstreeks naar de Salesforce-server wordt doorgegeven.
Evenzo zijn alle SOQL-functies ook beschikbaar met dezelfde methoden:
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)')
Als u een ongeldige SOQL doorgeeft, retourneert het Easysoft SOQL-stuurprogramma de fout rechtstreeks vanuit Salesforce. Bijvoorbeeld:
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".
Meer informatie over de SOQL-taal vindt u hier.
Gegevens in bulk invoegen met behulp van het SOQL-stuurprogramma
Binnen de Salesforce SOAP API is er een functie waarmee u tot 200 rijen gegevens kunt invoegen vanuit een enkele SOAP API-aanroep. Het Easysoft Salesforce SOQL ODBC-stuurprogramma maakt gebruik van deze functie en stelt u in staat SQL Server TSQL te gebruiken om maximaal 200 rijen tegelijk in bulk te laden.
In mijn voorbeeld ga ik nieuwe records toevoegen aan het Account-object binnen Salesforce. Dit is een heel eenvoudig voorbeeld met slechts een paar kolommen met gegevens, maar ik hoop dat dit uitlegt hoe bulk-inserts mogelijk zijn vanuit SQL Server. In SQL Server heb ik een lokale tabel met de naam Account die eruitziet als:
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
Deze TSQL werkt door mijn lokale accounttabel in een cursor te lezen.
Aan het begin van het eerste blok van 200 rijen, de Begin Trans
wordt aangeroepen, wat de Easysoft-driver vertelt dat alle gegevens die eraan worden doorgegeven, worden vastgehouden tot een Commit
of een Rollback
wordt gebeld.
De EXEC
functie stuurt elke rij in de cursor naar de Easysoft-driver. De driver bouwt vervolgens de benodigde SOAP API-aanroep op. Als er 200 rijen naar Easysoft zijn gestuurd, stuur ik een Commit
, waardoor de bestuurder de SOAP API-aanroep naar Salesforce stuurt.
Als het einde van de cursor is bereikt en er records zijn verzonden naar de Easysoft-driver die niet zijn doorgegeven aan Salesforce, stuur ik een laatste Commit
. De cursor wordt dan gesloten en ongedaan gemaakt.
De limiet van 200 rijen is een interne limiet binnen Salesforce. Als u meer dan 200 rijen probeert te verzenden, krijgt u een Salesforce-foutmelding. Het Easysoft-stuurprogramma heeft geen ingebouwde limieten, dus als Salesforce de limiet van 200 rijen verhoogt in toekomstige versies van de SOAP API, werkt het Easysoft-stuurprogramma automatisch met de nieuwe limiet.
Wanneer u deze bulk-invoegmethode gebruikt, is er geen limiet aan het aantal tabellen waarin u gegevens kunt invoegen in een enkel blok, dus de volgende TSQL zal werken:
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
Bij gebruik van de Begin Trans/Commit-methode voor invoegingen kunt u alleen invoegopdrachten verzenden. U kunt invoegingen en updates niet mixen en matchen, aangezien dit niet wordt ondersteund in de Salesforce SOAP API.
query bulken bijwerken en verwijderen
Ons SOQL-stuurprogramma heeft een ingebouwde methode voor het bulken van gegevenstransacties, indien gebruikt met een UPDATE- of een DELETE-query.
Dit voorbeeld laat zien hoe ik een aangepaste kolom update naar een ingestelde waarde.
EXEC ('UPDATE Account SET CustomerPriority__c=''low'' WHERE CustomerPriority__c=NULL') at SFSOQL8
Salesforce ondersteunt geen UPDATE's of DELETE's met SOQL, dus het Easysoft-stuurprogramma moet de query converteren naar een SOQL SELECT. De rijen die door de SELECT worden geretourneerd, worden vervolgens opgestapeld in blokken van maximaal 200 en worden blok voor blok verzonden voor een UPDATE of DELETE.
Transactionele ondersteuning van Easysoft
Het Easysoft Salesforce SOQL ODBC-stuurprogramma ondersteunt slechts één transactieniveau. Dus een Begin Trans
gevolgd door enkele INSERT's kunnen naar Salesforce worden verzonden met een COMMIT
of weggegooid in de driver met behulp van een ROLLBACK
.
Luie schemavalidatie
In de eigenschappen van uw SQL Server gekoppelde server onder de sectie "Serveropties" is een optie voor "Lazy Schema Validation". Standaard is dit ingesteld op FALSE, waardoor SQL Server bij het uitvoeren van een SELECT-instructie de instructie twee keer verzendt. De eerste keer dat het wordt verzonden, gebruikt SQL Server de doorgegeven details om de metagegevens over uw resultatenset op te bouwen. Daarna wordt de vraag opnieuw verzonden. Dit is nogal een dure overhead, dus Easysoft raadt aan om "Lazy Schema Validation" in te stellen op TRUE, wat betekent dat er slechts één SELECT wordt verzonden, die zowel de metagegevens als de gegevens ontvangt. Dit vermindert ook het aantal Salesforce API-aanroepen dat wordt gedaan.
Beperkingen van Microsoft's OLEDB for ODBC Provider
Details over de beperkingen van de OLEDB voor ODBC Provider zijn hier te vinden:
https://msdn.microsoft.com/en-us/library/ms719628(v=vs.85).aspx