Inhaltsverzeichnis
- Übersicht
- Einfache Auswahlabfragen in SQL Server funktionieren nicht
- Masseneinfügen von Daten mit dem SOQL-Treiber
- Bulk von Suchanfragen aktualisieren und löschen
- Easysoft-Transaktionsunterstützung
- Lazy Schema-Validierung
- Einschränkungen von Microsofts OLEDB für ODBC-Anbieter
Übersicht
Dieses Dokument enthält einige Tipps zur Verwendung von SQL Server mit Salesforce. Die zum Verbinden von SQL Server mit Salesforce verwendeten Komponenten sind ein SQL Server Linked Server und der Easysoft Salesforce ODBC-Treiber. Wie Sie SQL Server mit Salesforce verbinden, wird in diesem Artikel beschrieben. Für die Beispiele in diesem Dokument lautet der Name des Verbindungsservers (auf den Sie in Ihren SQL-Befehlen verweisen) SFSOQL8.
Das gesamte SQL in diesem Dokument wurde mit SQL Server 2017 und der Easysoft Salesforce ODBC-Treiberversion 2.0.0 getestet.
Wenn Sie zu diesem Dokument beitragen möchten, senden Sie Ihre Einreichung bitte per E-Mail an .
Einfache Auswahlabfragen in SQL Server funktionieren nicht
Angenommen, Sie versuchen, diese Abfrage in SQL Server auszuführen:
SELECT Id FROM SFSOQL8...Account
SQL Server konvertiert dieses SQL in:
SELECT "Tbl1002"."Id" "Col1004" FROM "Account" "Tbl1002"
Da die SOQL-Sprache von Salesforce das Umbenennen von Tabellen und Spalten auf diese Weise nicht unterstützt, erhalten Sie am Ende diesen Fehler:
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 verfügt über zwei Methoden zum Senden von SOQL an den Easysoft-Treiber:
OPENQUERY
, die in Verbindung mit lokalen Tabellen verwendet werden kann, um entfernte und lokale Daten zusammenzuführen.EXEC
die zusammen mit Parametern verwendet werden können, um Ihre SOQL direkt gegen Salesforce auszuführen.
Um diese Methoden zu demonstrieren, beginnen wir mit einem SOQL-Tabellenjoin:
SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity
In SQL Server können Sie eine der folgenden Abfragen ausführen:
SELECT * FROM OPENQUERY(SFSOQL8, 'SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity')
– Oder –
EXEC ('SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity') at SFSOQL8
Es gibt fast keinen Leistungsunterschied, da die von Ihnen geschriebene SOQL direkt an den Salesforce-Server weitergeleitet wird.
Ebenso sind alle SOQL-Funktionen mit denselben Methoden verfügbar:
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)')
Wenn Sie ungültiges SOQL übergeben, gibt der Easysoft SOQL-Treiber den Fehler direkt von Salesforce zurück. Zum Beispiel:
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".
Weitere Informationen zur SOQL-Sprache finden Sie hier.
Masseneinfügung von Daten mit dem SOQL-Treiber
Innerhalb der Salesforce-SOAP-API gibt es eine Funktion, mit der Sie bis zu 200 Datenzeilen aus einem einzigen SOAP-API-Aufruf einfügen können. Der SOQL-ODBC-Treiber von Easysoft Salesforce nutzt diese Funktion und ermöglicht Ihnen die Verwendung von SQL Server TSQL zum gleichzeitigen Massenladen von bis zu 200 Zeilen.
In meinem Beispiel füge ich dem Account-Objekt in Salesforce neue Datensätze hinzu. Dies ist ein sehr einfaches Beispiel mit nur wenigen Datenspalten, aber ich hoffe, dies erklärt, wie Masseneinfügungen von SQL Server aus möglich sind. In SQL Server habe ich eine lokale Tabelle namens Account, die so aussieht:
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; endfreigeben
Dieses TSQL funktioniert, indem es meine lokale Account-Tabelle in einen Cursor einliest.
Am Anfang des ersten Blocks von 200 Zeilen, dem Begin Trans
aufgerufen, was dem Easysoft-Treiber mitteilt, dass alle an ihn übergebenen Daten gehalten werden, bis entweder ein Commit
oder ein Rollback
heißt.
Die EXEC
Funktion sendet jede im Cursor gefundene Zeile an den Easysoft-Treiber. Der Treiber baut dann den erforderlichen SOAP-API-Aufruf auf. Wenn 200 Zeilen an Easysoft gesendet wurden, sende ich ein Commit
, wodurch der Treiber den SOAP-API-Aufruf an Salesforce sendet.
Wenn das Ende des Cursors erreicht ist und Datensätze an den Easysoft-Treiber gesendet wurden, die noch nicht an Salesforce übergeben wurden, sende ich ein letztes Commit
. Der Cursor wird dann geschlossen und die Zuordnung aufgehoben.
Das Limit von 200 Zeilen ist ein internes Limit in Salesforce. Wenn Sie versuchen, mehr als 200 Zeilen zu senden, erhalten Sie einen Salesforce-Fehler. Der Easysoft-Treiber hat keine eingebauten Limits. Wenn Salesforce also das Limit von 200 Zeilen in zukünftigen Versionen der SOAP-API erhöht, wird der Easysoft-Treiber automatisch mit dem neuen Limit arbeiten.
Bei Verwendung dieser Masseneinfügungsmethode gibt es keine Begrenzung für die Anzahl der Tabellen, in die Sie Daten in einem einzigen Block einfügen können, daher funktioniert die folgende TSQL:
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
Wenn Sie die Begin Trans/ Commit-Methode für Einfügungen verwenden, können Sie nur Einfügungsanweisungen senden. Sie können Einfügungen und Aktualisierungen nicht mischen und abgleichen, da dies in der Salesforce-SOAP-API nicht unterstützt wird.
Anfrage-Bulk aktualisieren und löschen
Unser SOQL-Treiber verfügt über eine integrierte Methode zum Sammeln von Datentransaktionen, wenn er mit einer UPDATE- oder einer DELETE-Abfrage verwendet wird.
Dieses Beispiel zeigt, wie ich eine benutzerdefinierte Spalte auf einen festgelegten Wert aktualisiere.
EXEC ('UPDATE Account SET CustomerPriority__c=''low'' WHERE CustomerPriority__c=NULL') at SFSOQL8
Salesforce unterstützt keine UPDATEs oder DELETEs mit SOQL, daher muss der Easysoft-Treiber die Abfrage in ein SOQL SELECT konvertieren. Die von SELECT zurückgegebenen Zeilen werden dann in Blöcke von bis zu 200 zusammengefasst und jeweils blockweise für ein UPDATE oder DELETE gesendet.
Easysoft-Transaktionsunterstützung
Der Easysoft Salesforce SOQL ODBC-Treiber unterstützt nur eine einzige Transaktionsebene. Also ein Begin Trans
gefolgt von einigen INSERTs können mit einem COMMIT
an Salesforce gesendet werden oder innerhalb des Treibers mit einem ROLLBACK
weggeworfen werden .
Lazy-Schema-Validierung
In den Eigenschaften Ihres SQL Server-Verbindungsservers im Abschnitt „Serveroptionen“ befindet sich eine Option für „Lazy Schema Validation“. Standardmäßig ist dies auf FALSE gesetzt, was dazu führt, dass SQL Server beim Ausführen einer SELECT-Anweisung die Anweisung zweimal sendet. Beim ersten Senden verwendet SQL Server die zurückgegebenen Details, um die Metadaten zu Ihrer Ergebnismenge aufzubauen. Dann wird die Abfrage erneut gesendet. Dies ist ein ziemlich teurer Overhead, daher würde Easysoft empfehlen, "Lazy Schema Validation" auf TRUE zu setzen, was bedeutet, dass nur ein SELECT gesendet wird, das sowohl die Metadaten als auch die Daten erhält. Dadurch wird auch die Anzahl der getätigten Salesforce-API-Aufrufe reduziert.
Einschränkungen von Microsofts OLEDB für ODBC-Anbieter
Einzelheiten zu den Einschränkungen des OLEDB für ODBC-Anbieter finden Sie hier:
https://msdn.microsoft.com/en-us/library/ms719628(v=vs.85).aspx